home *** CD-ROM | disk | FTP | other *** search
/ Computer Life 1996 January / Computer Life January 1996.iso / 3dmaze / 3dmaze.fr_ / 3dmaze.fr
Text File  |  1995-11-04  |  125KB  |  3,381 lines

  1. VERSION 4.00
  2. Begin VB.Form frm3DMaze 
  3.    BackColor       =   &H00FFFFFF&
  4.    Caption         =   "3DMaze"
  5.    ClientHeight    =   4464
  6.    ClientLeft      =   1560
  7.    ClientTop       =   1980
  8.    ClientWidth     =   6000
  9.    Height          =   5136
  10.    Icon            =   "3dmaze.frx":0000
  11.    KeyPreview      =   -1  'True
  12.    Left            =   1512
  13.    LinkTopic       =   "Form1"
  14.    ScaleHeight     =   4464
  15.    ScaleWidth      =   6000
  16.    Top             =   1356
  17.    Width           =   6096
  18.    Begin VB.TextBox Text1 
  19.       BackColor       =   &H00FFFFFF&
  20.       BorderStyle     =   0  'None
  21.       Height          =   288
  22.       Left            =   0
  23.       Locked          =   -1  'True
  24.       TabIndex        =   1
  25.       Top             =   4200
  26.       Width           =   6012
  27.    End
  28.    Begin VB.VScrollBar VScroll1 
  29.       Height          =   4212
  30.       LargeChange     =   5
  31.       Left            =   5760
  32.       Max             =   60
  33.       Min             =   30
  34.       TabIndex        =   0
  35.       Top             =   0
  36.       Value           =   45
  37.       Width           =   252
  38.    End
  39.    Begin VB.Timer Timer1 
  40.       Enabled         =   0   'False
  41.       Interval        =   55
  42.       Left            =   0
  43.       Top             =   0
  44.    End
  45.    Begin VB.Menu mnuAction 
  46.       Caption         =   "&Action"
  47.       Begin VB.Menu mnuActionItem 
  48.          Caption         =   "&New"
  49.          Index           =   0
  50.       End
  51.       Begin VB.Menu mnuActionItem 
  52.          Caption         =   "&Solve"
  53.          Enabled         =   0   'False
  54.          Index           =   1
  55.       End
  56.       Begin VB.Menu mnuActionItem 
  57.          Caption         =   "&Clear"
  58.          Enabled         =   0   'False
  59.          Index           =   2
  60.       End
  61.       Begin VB.Menu mnuActionItem 
  62.          Caption         =   "-"
  63.          Index           =   3
  64.       End
  65.       Begin VB.Menu mnuActionItem 
  66.          Caption         =   "E&xit"
  67.          Index           =   4
  68.       End
  69.    End
  70.    Begin VB.Menu mnuStyle 
  71.       Caption         =   "&Style"
  72.       Begin VB.Menu mnuStyleItem 
  73.          Caption         =   "&Hexagonal rooms"
  74.          Index           =   0
  75.       End
  76.       Begin VB.Menu mnuStyleItem 
  77.          Caption         =   "&Square rooms"
  78.          Index           =   1
  79.       End
  80.    End
  81.    Begin VB.Menu mnuHelp 
  82.       Caption         =   "&Help"
  83.       Begin VB.Menu mnuHelpItem 
  84.          Caption         =   "&About..."
  85.          Index           =   0
  86.       End
  87.    End
  88. End
  89. Attribute VB_Name = "frm3DMaze"
  90. Attribute VB_Creatable = False
  91. Attribute VB_Exposed = False
  92.  
  93. Option Explicit
  94.  
  95. Private Type CornerRec
  96.   X As Long
  97.   Y As Long
  98. End Type
  99.  
  100. Private Type VertexRec
  101.   X As Double
  102.   Y As Double
  103. End Type
  104.  
  105. Private Type StackRec
  106.   Index1 As Byte
  107.   Index2 As Integer
  108. End Type
  109.  
  110. Private Type PALETTEENTRY
  111.   peRed As Byte
  112.   peGreen As Byte
  113.   peBlue As Byte
  114.   peFlags As Byte
  115. End Type
  116.  
  117. Private Type LOGPALETTE
  118.   palVersion As Integer
  119.   palNumEntries As Integer
  120.   palPalEntry(16) As PALETTEENTRY
  121. End Type
  122.  
  123. Private Declare Function CreatePalette Lib "GDI32" (LogicalPalette As LOGPALETTE) As Long
  124. Private Declare Function CreatePen Lib "GDI32" (ByVal PenStyle As Long, ByVal Width As Long, ByVal Color As Long) As Long
  125. Private Declare Function CreatePolygonRgn Lib "GDI32" (lpPoints As Any, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
  126. Private Declare Function CreateSolidBrush Lib "GDI32" (ByVal rgbColor As Long) As Long
  127. Private Declare Function DeleteObject Lib "GDI32" (ByVal hndobj As Long) As Long
  128. Private Declare Function FillRgn Lib "GDI32" (ByVal hDC As Long, ByVal hRegion As Long, ByVal hBrush As Long) As Long
  129. Private Declare Function GetDeviceCaps Lib "GDI32" (ByVal hDC As Long, ByVal Index As Long) As Long
  130. Private Declare Function LineTo Lib "GDI32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long
  131. Private Declare Function MoveToEx Lib "GDI32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal NullPtr As Long) As Long
  132. Private Declare Function RealizePalette Lib "GDI32" (ByVal hDC As Long) As Long
  133. Private Declare Function SelectPalette Lib "GDI32" (ByVal hDC As Long, ByVal PaletteHandle As Long, ByVal Background As Long) As Long
  134. Private Declare Function SelectObject Lib "GDI32" (ByVal hDC As Long, ByVal ObjectHandle As Long) As Long
  135.  
  136. Const PLANES = 14
  137. Const BITSPIXEL = 12
  138. Const PC_NOCOLLAPSE = 4
  139. Const COLORS = 24
  140. Const PS_SOLID = 0
  141.  
  142. Const NumColors = 16
  143. Const TopColor = 12: ' all but last 3 colors are gray
  144. Const RectangleSENWColor = 10
  145. Const TriangleSSENNWColor = 9
  146. Const TriangleSENWColor = 8
  147. Const RectangleWEColor = 7
  148. Const FloorColor = 6
  149. Const TriangleSWNEColor = 5
  150. Const RectangleSWNEColor = 4
  151. Const TriangleSSWNNEColor = 3
  152. Const BackoutColor = 13
  153. Const AdvanceColor = 14
  154. Const SolutionColor = 15
  155.  
  156. Const RelativeWidthOfWall = 0.25: ' relative to side of hexagon or square
  157. Const RelativeHeightOfWall = 2#: ' relative to side of hexagon or square
  158. Const MinWallLengthInInches = 0.25
  159.  
  160. Const SecondsForMazeSelection = 0.25
  161.  
  162. Dim AlreadyPainting As Boolean
  163. Dim BaseRectangle(5, 3) As VertexRec
  164. Dim BaseTriangle(3, 2) As VertexRec
  165. Dim ComputerPage() As Byte
  166. Dim CosTilt As Double
  167. Dim CurrentColor As Integer
  168. Dim HexDeltaX(5, 719) As Integer
  169. Dim HexDeltaY(5, 719) As Integer
  170. Dim MaxX As Integer
  171. Dim MaxY As Integer
  172. Dim Minimized As Boolean
  173. Dim NumColumns As Integer
  174. Dim NumRealized As Long
  175. Dim NumRoomsInMaze As Integer
  176. Dim NumRows As Integer
  177. Dim OldPaletteHandle As Long
  178. Dim Paint As Boolean
  179. Dim PaletteHandle As Long
  180. Dim PixelsPerX As Double
  181. Dim PixelsPerZ As Double
  182. Dim Rectangle(5, 3) As VertexRec
  183. Dim RedGreenBlue(16) As Long
  184. Dim RelDistOfUserFromScreen As Double
  185. Dim Resize As Boolean
  186. Dim Seed As String
  187. Dim SinTilt As Double
  188. Dim SolutionDisplayed As Boolean
  189. Dim SqrDeltaX(3, 23) As Integer
  190. Dim SqrDeltaY(3, 23) As Integer
  191. Dim Sqrt3 As Double
  192. Dim Stack() As StackRec
  193. Dim State As Byte
  194. Dim SubstitutionHigh(99) As Byte
  195. Dim SubstitutionLow(99) As Byte
  196. Dim Tilt As Double
  197. Dim UsePalette As Boolean
  198. Dim UserHasSolved As Boolean
  199. Dim UserPage() As Byte
  200. Dim UserX As Integer
  201. Dim UserXRelative As Double
  202. Dim UserY As Integer
  203. Dim UserYRelative As Double
  204. Dim X As Integer
  205. Dim XMax As Double
  206. Dim XOffset As Double
  207. Dim Y As Integer
  208. Dim YMax As Double
  209. Dim YMod4 As Byte
  210. Dim YOffset As Double
  211.  
  212. Private Sub DrawQuadrilateral(Box() As CornerRec, ColorNum As Integer)
  213.   Dim Brush As Long
  214.   Dim rc As Long
  215.   Dim Region As Long
  216.   If UsePalette Then
  217.     Brush = CreateSolidBrush(16777216 + ColorNum)
  218.     If Brush Then
  219.       Region = CreatePolygonRgn(Box(0), 4, 1)
  220.       If Region Then
  221.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  222.         rc = DeleteObject(Region)
  223.       End If
  224.       rc = DeleteObject(Brush)
  225.     End If
  226.   Else
  227.     Brush = CreateSolidBrush(RedGreenBlue(ColorNum))
  228.     If Brush Then
  229.       Region = CreatePolygonRgn(Box(0), 4, 1)
  230.       If Region Then
  231.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  232.         rc = DeleteObject(Region)
  233.       End If
  234.       rc = DeleteObject(Brush)
  235.     End If
  236.   End If
  237. End Sub
  238.  
  239. Private Sub GetCorner(X#, Y#, Z#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, Corner As CornerRec)
  240.   Dim XAdjusted As Double
  241.   Dim YPrime As Double
  242.   Dim ZAdjusted As Double
  243.   Dim ZPrime As Double
  244.  
  245.   YPrime = (YMax# - Y#) * CosTilt# - Z# * SinTilt#
  246.   ZPrime = (YMax# - Y#) * SinTilt# + Z# * CosTilt#
  247.   ZAdjusted = (YMax# / 2#) + RelDistOfUserFromScreen# * (ZPrime - (YMax# / 2#)) / (YPrime + RelDistOfUserFromScreen#)
  248.   XAdjusted = (XMax# / 2#) + RelDistOfUserFromScreen# * (X# - (XMax# / 2#)) / (YPrime + RelDistOfUserFromScreen#)
  249.   XAdjusted = XAdjusted + XOffset#
  250.   Corner.X = Int(PixelsPerX# * XAdjusted)
  251.   Corner.Y = (ScaleHeight - Text1.Height) - Int(PixelsPerZ# * ZAdjusted)
  252. End Sub
  253.  
  254. Private Sub DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0#, Y0#, Z0#, X1#, Y1#, Z1#, X2#, Y2#, Z2#, X3#, Y3#, Z3#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, Shade%)
  255.   Dim Quadrilateral(3) As CornerRec
  256.   Dim TemQuad As CornerRec
  257.   Call GetCorner(X0#, Y0#, Z0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  258.   Quadrilateral(0).X = TemQuad.X
  259.   Quadrilateral(0).Y = TemQuad.Y
  260.   Call GetCorner(X1#, Y1#, Z1#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  261.   Quadrilateral(1).X = TemQuad.X
  262.   Quadrilateral(1).Y = TemQuad.Y
  263.   Call GetCorner(X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  264.   Quadrilateral(2).X = TemQuad.X
  265.   Quadrilateral(2).Y = TemQuad.Y
  266.   Call GetCorner(X3#, Y3#, Z3#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  267.   Quadrilateral(3).X = TemQuad.X
  268.   Quadrilateral(3).Y = TemQuad.Y
  269.   Call DrawQuadrilateral(Quadrilateral(), Shade%)
  270. End Sub
  271.  
  272. Private Sub DrawTriangle(Box() As CornerRec, ColorNum As Integer)
  273.   Dim Brush As Long
  274.   Dim rc As Long
  275.   Dim Region As Long
  276.   If UsePalette Then
  277.     Brush = CreateSolidBrush(16777216 + ColorNum)
  278.     If Brush Then
  279.       Region = CreatePolygonRgn(Box(0), 3, 1)
  280.       If Region Then
  281.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  282.         rc = DeleteObject(Region)
  283.       End If
  284.       rc = DeleteObject(Brush)
  285.     End If
  286.   Else
  287.     Brush = CreateSolidBrush(RedGreenBlue(ColorNum))
  288.     If Brush Then
  289.       Region = CreatePolygonRgn(Box(0), 3, 1)
  290.       If Region Then
  291.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  292.         rc = DeleteObject(Region)
  293.       End If
  294.       rc = DeleteObject(Brush)
  295.     End If
  296.   End If
  297. End Sub
  298.  
  299. Private Sub DisplayTriangle(XMax#, XOffset#, YMax#, X0#, Y0#, Z0#, X1#, Y1#, Z1#, X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, Shade%)
  300.   Dim Triangle(2) As CornerRec
  301.   Dim TemTriangle As CornerRec
  302.   Call GetCorner(X0#, Y0#, Z0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
  303.   Triangle(0).X = TemTriangle.X
  304.   Triangle(0).Y = TemTriangle.Y
  305.   Call GetCorner(X1#, Y1#, Z1#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
  306.   Triangle(1).X = TemTriangle.X
  307.   Triangle(1).Y = TemTriangle.Y
  308.   Call GetCorner(X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
  309.   Triangle(2).X = TemTriangle.X
  310.   Triangle(2).Y = TemTriangle.Y
  311.   Call DrawTriangle(Triangle(), Shade%)
  312. End Sub
  313.  
  314. Private Sub OutputTriangle(XMax#, XOffset#, YMax#, Triangle() As VertexRec, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, FirstPass%, FaceColor%)
  315.   Dim X0 As Double
  316.   Dim X1 As Double
  317.   Dim X2 As Double
  318.   Dim X3 As Double
  319.   Dim Y0 As Double
  320.   Dim Y1 As Double
  321.   Dim Y2 As Double
  322.   Dim Y3 As Double
  323.   If FirstPass% Then
  324.     If ((Triangle(1).X < XMax# / 2#) And (Triangle(1).X > Triangle(0).X)) Then
  325.       X0 = Triangle(2).X
  326.       Y0 = Triangle(2).Y
  327.       X1 = Triangle(1).X
  328.       Y1 = Triangle(1).Y
  329.       X2 = Triangle(1).X
  330.       Y2 = Triangle(1).Y
  331.       X3 = Triangle(2).X
  332.       Y3 = Triangle(2).Y
  333.       Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TriangleSSWNNEColor)
  334.     End If
  335.     If ((Triangle(1).X > XMax# / 2#) And (Triangle(1).X < Triangle(2).X)) Then
  336.       X0 = Triangle(1).X
  337.       Y0 = Triangle(1).Y
  338.       X1 = Triangle(0).X
  339.       Y1 = Triangle(0).Y
  340.       X2 = Triangle(0).X
  341.       Y2 = Triangle(0).Y
  342.       X3 = Triangle(1).X
  343.       Y3 = Triangle(1).Y
  344.       Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TriangleSSENNWColor)
  345.     End If
  346.   Else
  347.     X0 = Triangle(0).X
  348.     Y0 = Triangle(0).Y
  349.     X1 = Triangle(2).X
  350.     Y1 = Triangle(2).Y
  351.     X2 = Triangle(2).X
  352.     Y2 = Triangle(2).Y
  353.     X3 = Triangle(0).X
  354.     Y3 = Triangle(0).Y
  355.     Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, FaceColor%)
  356.     X0 = Triangle(0).X
  357.     Y0 = Triangle(0).Y
  358.     X1 = Triangle(1).X
  359.     Y1 = Triangle(1).Y
  360.     X2 = Triangle(2).X
  361.     Y2 = Triangle(2).Y
  362.     Call DisplayTriangle(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, RelativeHeightOfWall, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TopColor)
  363.   End If
  364. End Sub
  365.  
  366. Private Sub OutputRectangle(XMax As Double, XOffset As Double, YMax As Double, Rectangle() As VertexRec, PixelsPerX As Double, PixelsPerZ As Double, CosTilt As Double, SinTilt As Double, RelDistOfUserFromScreen As Double, FaceColor As Integer)
  367.   Dim X0 As Double
  368.   Dim X1 As Double
  369.   Dim X2 As Double
  370.   Dim X3 As Double
  371.   Dim Y0 As Double
  372.   Dim Y1 As Double
  373.   Dim Y2 As Double
  374.   Dim Y3 As Double
  375.   X0 = Rectangle(3).X
  376.   Y0 = Rectangle(3).Y
  377.   X1 = Rectangle(2).X
  378.   Y1 = Rectangle(2).Y
  379.   X2 = Rectangle(2).X
  380.   Y2 = Rectangle(2).Y
  381.   X3 = Rectangle(3).X
  382.   Y3 = Rectangle(3).Y
  383.   Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FaceColor)
  384.   X0 = Rectangle(0).X
  385.   Y0 = Rectangle(0).Y
  386.   X1 = Rectangle(1).X
  387.   Y1 = Rectangle(1).Y
  388.   X2 = Rectangle(2).X
  389.   Y2 = Rectangle(2).Y
  390.   X3 = Rectangle(3).X
  391.   Y3 = Rectangle(3).Y
  392.   Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, RelativeHeightOfWall, X3, Y3, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, TopColor)
  393. End Sub
  394.  
  395. Private Sub OutputLeftRight(XMax As Double, XOffset As Double, YMax As Double, Rectangle() As VertexRec, PixelsPerX As Double, PixelsPerZ As Double, CosTilt As Double, SinTilt As Double, RelDistOfUserFromScreen As Double)
  396.   Dim X0 As Double
  397.   Dim X1 As Double
  398.   Dim X2 As Double
  399.   Dim X3 As Double
  400.   Dim Y0 As Double
  401.   Dim Y1 As Double
  402.   Dim Y2 As Double
  403.   Dim Y3 As Double
  404.   If 2# * Rectangle(0).X > XMax Then
  405.     X0 = Rectangle(0).X
  406.     Y0 = Rectangle(0).Y
  407.     X1 = Rectangle(3).X
  408.     Y1 = Rectangle(3).Y
  409.     X2 = Rectangle(3).X
  410.     Y2 = Rectangle(3).Y
  411.     X3 = Rectangle(0).X
  412.     Y3 = Rectangle(0).Y
  413.     Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSENWColor)
  414.   End If
  415.   If 2# * Rectangle(1).X < XMax Then
  416.     X0 = Rectangle(2).X
  417.     Y0 = Rectangle(2).Y
  418.     X1 = Rectangle(1).X
  419.     Y1 = Rectangle(1).Y
  420.     X2 = Rectangle(1).X
  421.     Y2 = Rectangle(1).Y
  422.     X3 = Rectangle(2).X
  423.     Y3 = Rectangle(2).Y
  424.     Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSWNEColor)
  425.   End If
  426. End Sub
  427.  
  428. Private Sub DrawLine(X1 As Double, Y1 As Double, X2 As Double, Y2 As Double, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  429.   Dim LineX1 As Long
  430.   Dim LineX2 As Long
  431.   Dim LineY1 As Long
  432.   Dim LineY2 As Long
  433.   Dim Pen As Long
  434.   Dim PreviousPen As Long
  435.   Dim rc As Long
  436.   Dim tem As CornerRec
  437.   Call GetCorner(X1, Y1, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, XMax, XOffset, YMax, tem)
  438.   LineX1 = tem.X
  439.   LineY1 = tem.Y
  440.   Call GetCorner(X2, Y2, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, XMax, XOffset, YMax, tem)
  441.   LineX2 = tem.X
  442.   LineY2 = tem.Y
  443.   If UsePalette Then
  444.     Pen = CreatePen(PS_SOLID, 2, 16777216 + CurrentColor)
  445.     If Pen Then
  446.       PreviousPen = SelectObject(frm3DMaze.hDC, Pen)
  447.       rc = MoveToEx(frm3DMaze.hDC, LineX1, LineY1, 0)
  448.       rc = LineTo(frm3DMaze.hDC, LineX2, LineY2)
  449.       rc = DeleteObject(Pen)
  450.     End If
  451.   Else
  452.     Pen = CreatePen(PS_SOLID, 2, RedGreenBlue(CurrentColor))
  453.     If Pen Then
  454.       PreviousPen = SelectObject(frm3DMaze.hDC, Pen)
  455.       rc = MoveToEx(frm3DMaze.hDC, LineX1, LineY1, 0)
  456.       rc = LineTo(frm3DMaze.hDC, LineX2, LineY2)
  457.       rc = DeleteObject(Pen)
  458.     End If
  459.   End If
  460. End Sub
  461.  
  462. Private Sub Hash(Counter0 As Byte, Counter1 As Byte, Counter2 As Byte, Counter3 As Byte, Counter4 As Byte, Counter5 As Byte, Counter6 As Byte, Counter7 As Byte)
  463.   Dim Iteration As Byte
  464.   Dim Seed0 As Byte
  465.   Dim Seed1 As Byte
  466.   Dim Seed2 As Byte
  467.   Dim Seed3 As Byte
  468.   Dim Seed4 As Byte
  469.   Dim Seed5 As Byte
  470.   Dim Seed6 As Byte
  471.   Dim Seed7 As Byte
  472.   Dim SubstitutionIndex As Byte
  473.   Dim Tem0 As Byte
  474.   Dim Tem1 As Byte
  475.   Dim Tem2 As Byte
  476.   Seed0 = Counter0
  477.   Seed1 = Counter1
  478.   Seed2 = Counter2
  479.   Seed3 = Counter3
  480.   Seed4 = Counter4
  481.   Seed5 = Counter5
  482.   Seed6 = Counter6
  483.   Seed7 = Counter7
  484.   For Iteration = 1 To 8
  485.     SubstitutionIndex = 10 * Seed1 + Seed0
  486.     Tem0 = SubstitutionLow(SubstitutionIndex)
  487.     Tem1 = SubstitutionHigh(SubstitutionIndex)
  488.     SubstitutionIndex = 10 * Seed3 + Seed2
  489.     Seed0 = SubstitutionLow(SubstitutionIndex)
  490.     Tem2 = SubstitutionHigh(SubstitutionIndex)
  491.     SubstitutionIndex = 10 * Seed5 + Seed4
  492.     Seed2 = SubstitutionLow(SubstitutionIndex)
  493.     Seed1 = SubstitutionHigh(SubstitutionIndex)
  494.     SubstitutionIndex = 10 * Seed7 + Seed6
  495.     Seed5 = SubstitutionLow(SubstitutionIndex)
  496.     Seed7 = SubstitutionHigh(SubstitutionIndex)
  497.     Seed3 = Tem0
  498.     Seed6 = Tem1
  499.     Seed4 = Tem2
  500.   Next Iteration
  501.   Counter0 = Seed0
  502.   Counter1 = Seed1
  503.   Counter2 = Seed2
  504.   Counter3 = Seed3
  505.   Counter4 = Seed4
  506.   Counter5 = Seed5
  507.   Counter6 = Seed6
  508.   Counter7 = Seed7
  509. End Sub
  510.  
  511. Private Sub Increment(Counter0 As Byte, Counter1 As Byte, Counter2 As Byte, Counter3 As Byte, Counter4 As Byte, Counter5 As Byte, Counter6 As Byte, Counter7 As Byte)
  512.   Dim tem As Byte
  513.   tem = Counter0 + 1
  514.   If tem <= 9 Then
  515.     Counter0 = tem
  516.   Else
  517.     Counter0 = 0
  518.     tem = Counter1 + 1
  519.     If tem <= 9 Then
  520.       Counter1 = tem
  521.     Else
  522.       Counter1 = 0
  523.       tem = Counter2 + 1
  524.       If tem <= 9 Then
  525.         Counter2 = tem
  526.       Else
  527.         Counter2 = 0
  528.         tem = Counter3 + 1
  529.         If tem <= 9 Then
  530.           Counter3 = tem
  531.         Else
  532.           Counter3 = 0
  533.           tem = Counter4 + 1
  534.           If tem <= 9 Then
  535.             Counter4 = tem
  536.           Else
  537.             Counter4 = 0
  538.             tem = Counter5 + 1
  539.             If tem <= 9 Then
  540.               Counter5 = tem
  541.             Else
  542.               Counter5 = 0
  543.               tem = Counter6 + 1
  544.               If tem <= 9 Then
  545.                 Counter6 = tem
  546.               Else
  547.                 Counter6 = 0
  548.                 tem = Counter7 + 1
  549.                 If tem <= 9 Then
  550.                   Counter7 = tem
  551.                 Else
  552.                   Counter7 = 0
  553.                 End If
  554.               End If
  555.             End If
  556.           End If
  557.         End If
  558.       End If
  559.     End If
  560.   End If
  561. End Sub
  562.  
  563. Private Sub HexDisplaySolution(MaxY As Integer, Page() As Byte, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  564.   Dim DeltaIndex As Byte
  565.   Dim OldPaletteHandle As Long
  566.   Dim PathFound As Integer
  567.   Dim X As Integer
  568.   Dim XNext As Integer
  569.   Dim XPrevious As Integer
  570.   Dim XRelative As Double
  571.   Dim XRelativeNext As Double
  572.   Dim Y As Integer
  573.   Dim YNext As Integer
  574.   Dim YPrevious As Integer
  575.   Dim YRelative As Double
  576.   Dim YRelativeNext As Double
  577.   If UsePalette Then
  578.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  579.     NumRealized = RealizePalette(frm3DMaze.hDC)
  580.   End If
  581.   XRelative = 1#
  582.   YRelative = Sqrt3 / 2#
  583.   CurrentColor = SolutionColor
  584.   Call DrawLine(1#, 0#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  585.   XPrevious = 3
  586.   YPrevious = -2
  587.   X = 3
  588.   Y = 2
  589.   Do
  590.     PathFound = False
  591.     DeltaIndex = 0
  592.     Do While (Not PathFound)
  593.       XNext = X + HexDeltaX(DeltaIndex, 0)
  594.       YNext = Y + HexDeltaY(DeltaIndex, 0)
  595.       If Page(YNext, XNext) = 1 Then
  596.         XNext = XNext + HexDeltaX(DeltaIndex, 0)
  597.         YNext = YNext + HexDeltaY(DeltaIndex, 0)
  598.         If (XNext <> XPrevious) Or (YNext <> YPrevious) Then
  599.           PathFound = True
  600.         Else
  601.           DeltaIndex = DeltaIndex + 1
  602.         End If
  603.       Else
  604.         DeltaIndex = DeltaIndex + 1
  605.       End If
  606.     Loop
  607.     If YNext < MaxY Then
  608.       Select Case YNext - Y
  609.         Case -4
  610.           XRelativeNext = XRelative
  611.           YRelativeNext = YRelative - Sqrt3
  612.         Case -2
  613.           If XNext > X Then
  614.             XRelativeNext = XRelative + 3# / 2#
  615.             YRelativeNext = YRelative - Sqrt3 / 2#
  616.           Else
  617.             XRelativeNext = XRelative - 3# / 2#
  618.             YRelativeNext = YRelative - Sqrt3 / 2#
  619.           End If
  620.         Case 2
  621.           If XNext > X Then
  622.             XRelativeNext = XRelative + 3# / 2#
  623.             YRelativeNext = YRelative + Sqrt3 / 2#
  624.           Else
  625.             XRelativeNext = XRelative - 3# / 2#
  626.             YRelativeNext = YRelative + Sqrt3 / 2#
  627.           End If
  628.         Case Else
  629.           XRelativeNext = XRelative
  630.           YRelativeNext = YRelative + Sqrt3
  631.       End Select
  632.       Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  633.     Else
  634.       Call DrawLine(XRelative, YRelative, XRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  635.     End If
  636.     XPrevious = X
  637.     YPrevious = Y
  638.     X = XNext
  639.     Y = YNext
  640.     XRelative = XRelativeNext
  641.     YRelative = YRelativeNext
  642.   Loop While YNext < MaxY
  643.   If UsePalette Then
  644.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  645.   End If
  646. End Sub
  647.  
  648. Private Sub HexDisplayUserMoves(MaxX As Integer, MaxY As Integer, Page() As Byte, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  649.   Dim DeltaIndex As Byte
  650.   Dim EvenRow As Boolean
  651.   Dim OldPaletteHandle As Long
  652.   Dim X As Integer
  653.   Dim XNext As Integer
  654.   Dim XNextNext As Integer
  655.   Dim XRelative As Double
  656.   Dim XRelativeNext As Double
  657.   Dim Y As Integer
  658.   Dim YNext As Integer
  659.   Dim YNextNext As Integer
  660.   Dim YRelative As Double
  661.   Dim YRelativeNext As Double
  662.   If UsePalette Then
  663.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  664.     NumRealized = RealizePalette(frm3DMaze.hDC)
  665.   End If
  666.   Y = 2
  667.   YRelative = Sqrt3 / 2#
  668.   EvenRow = False
  669.   Do While (Y < MaxY)
  670.     If EvenRow Then
  671.       X = 7
  672.       XRelative = 2.5
  673.     Else
  674.       X = 3
  675.       XRelative = 1#
  676.     End If
  677.     Do While (X < MaxX)
  678.       If ((Page(Y, X) = 1) Or (Page(Y, X) = 3)) Then
  679.         For DeltaIndex = 0 To 5
  680.           XNext = X + HexDeltaX(DeltaIndex, 0)
  681.           YNext = Y + HexDeltaY(DeltaIndex, 0)
  682.           If Page(YNext, XNext) <> 0 Then
  683.             If YNext = 0 Then
  684.               CurrentColor = AdvanceColor
  685.               Call DrawLine(1#, 0#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  686.             Else
  687.               If YNext = MaxY Then
  688.                 If UserHasSolved Then
  689.                   CurrentColor = AdvanceColor
  690.                   YRelativeNext = YRelative + Sqrt3 / 2#
  691.                   Call DrawLine(XRelative, YRelative, XRelative, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  692.                 End If
  693.               Else
  694.                 XNextNext = XNext + HexDeltaX(DeltaIndex, 0)
  695.                 If XNextNext > 0 Then
  696.                   If XNextNext < MaxX Then
  697.                     YNextNext = YNext + HexDeltaY(DeltaIndex, 0)
  698.                     If YNextNext > 0 Then
  699.                       If YNextNext < MaxY Then
  700.                         If ((Page(YNextNext, XNextNext) = 1) Or (Page(YNextNext, XNextNext) = 3)) Then
  701.                           If Page(Y, X) = Page(YNextNext, XNextNext) Then
  702.                             If Page(Y, X) = 1 Then
  703.                               CurrentColor = AdvanceColor
  704.                             Else
  705.                               CurrentColor = BackoutColor
  706.                             End If
  707.                           Else
  708.                             CurrentColor = BackoutColor
  709.                           End If
  710.                           Select Case (YNext - Y)
  711.                             Case -2
  712.                               XRelativeNext = XRelative
  713.                               YRelativeNext = YRelative - Sqrt3 / 2#
  714.                             Case -1
  715.                               If XNext > X Then
  716.                                 XRelativeNext = XRelative + 3# / 4#
  717.                                 YRelativeNext = YRelative - Sqrt3 / 4#
  718.                               Else
  719.                                 XRelativeNext = XRelative - 3# / 4#
  720.                                 YRelativeNext = YRelative - Sqrt3 / 4#
  721.                               End If
  722.                             Case 1
  723.                               If XNext > X Then
  724.                                 XRelativeNext = XRelative + 3# / 4#
  725.                                 YRelativeNext = YRelative + Sqrt3 / 4#
  726.                               Else
  727.                                 XRelativeNext = XRelative - 3# / 4#
  728.                                 YRelativeNext = YRelative + Sqrt3 / 4#
  729.                               End If
  730.                             Case Else
  731.                               XRelativeNext = XRelative
  732.                               YRelativeNext = YRelative + Sqrt3 / 2#
  733.                           End Select
  734.                           Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  735.                         End If
  736.                        End If
  737.                     End If
  738.                   End If
  739.                 End If
  740.               End If
  741.             End If
  742.           End If
  743.         Next DeltaIndex
  744.       End If
  745.       XRelative = XRelative + 3#
  746.       X = X + 8
  747.     Loop
  748.     EvenRow = Not EvenRow
  749.     YRelative = YRelative + Sqrt3 / 2#
  750.     Y = Y + 2
  751.   Loop
  752.   If UsePalette Then
  753.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  754.   End If
  755. End Sub
  756.  
  757. Private Sub HexSolveMaze(Stack() As StackRec, Page() As Byte, NumRoomsInSolution As Integer, Adjacency As Integer, MaxX As Integer, MaxY As Integer)
  758.   Dim DeltaIndex As Byte
  759.   Dim PassageFound As Integer
  760.   Dim StackHead As Integer
  761.   Dim X As Integer
  762.   Dim XNext As Integer
  763.   Dim Y As Integer
  764.   Dim YNext As Integer
  765.  
  766.   NumRoomsInSolution = 1
  767.   Adjacency = 0
  768.   X = 3
  769.   Y = 2
  770.   StackHead = -1
  771.   Page(Y, X) = 1
  772.   Do
  773.     DeltaIndex = 0
  774.     PassageFound = False
  775.     Do
  776.       Do While ((DeltaIndex < 6) And (Not PassageFound))
  777.         XNext = X + HexDeltaX(DeltaIndex, 0)
  778.         YNext = Y + HexDeltaY(DeltaIndex, 0)
  779.         If Page(YNext, XNext) = 2 Then
  780.           PassageFound = True
  781.         Else
  782.           DeltaIndex = DeltaIndex + 1
  783.         End If
  784.       Loop
  785.       If Not PassageFound Then
  786.         DeltaIndex = Stack(StackHead).Index1
  787.         Page(Y, X) = 2
  788.         X = X - HexDeltaX(DeltaIndex, 0)
  789.         Y = Y - HexDeltaY(DeltaIndex, 0)
  790.         Page(Y, X) = 2
  791.         X = X - HexDeltaX(DeltaIndex, 0)
  792.         Y = Y - HexDeltaY(DeltaIndex, 0)
  793.         StackHead = StackHead - 1
  794.         DeltaIndex = DeltaIndex + 1
  795.       End If
  796.     Loop While Not PassageFound
  797.     Page(YNext, XNext) = 1
  798.     XNext = XNext + HexDeltaX(DeltaIndex, 0)
  799.     YNext = YNext + HexDeltaY(DeltaIndex, 0)
  800.     If YNext <= MaxY Then
  801.       StackHead = StackHead + 1
  802.       Stack(StackHead).Index1 = DeltaIndex
  803.       Page(YNext, XNext) = 1
  804.       X = XNext
  805.       Y = YNext
  806.     End If
  807.   Loop While YNext < MaxY
  808.   X = MaxX - 3
  809.   Y = MaxY - 2
  810.   Adjacency = 0
  811.   Do While (StackHead >= 0)
  812.     For DeltaIndex = 0 To 5
  813.       XNext = X + HexDeltaX(DeltaIndex, 0)
  814.       YNext = Y + HexDeltaY(DeltaIndex, 0)
  815.       If Page(YNext, XNext) <> 1 Then
  816.         If Page(YNext, XNext) = 0 Then
  817.           XNext = XNext + HexDeltaX(DeltaIndex, 0)
  818.           YNext = YNext + HexDeltaY(DeltaIndex, 0)
  819.           If XNext < 0 Then
  820.             Adjacency = Adjacency + 1
  821.           Else
  822.             If XNext > MaxX Then
  823.               Adjacency = Adjacency + 1
  824.             Else
  825.               If YNext < 0 Then
  826.                 Adjacency = Adjacency + 1
  827.               Else
  828.                 If YNext > MaxY Then
  829.                   Adjacency = Adjacency + 1
  830.                 Else
  831.                   If Page(YNext, XNext) = 1 Then
  832.                     Adjacency = Adjacency + 1
  833.                   End If
  834.                 End If
  835.               End If
  836.             End If
  837.           End If
  838.         End If
  839.       End If
  840.     Next DeltaIndex
  841.     X = X - 2 * HexDeltaX(Stack(StackHead).Index1, 0)
  842.     Y = Y - 2 * HexDeltaY(Stack(StackHead).Index1, 0)
  843.     StackHead = StackHead - 1
  844.     NumRoomsInSolution = NumRoomsInSolution + 1
  845.   Loop
  846.   For DeltaIndex = 0 To 5
  847.     XNext = X + HexDeltaX(DeltaIndex, 0)
  848.     YNext = X + HexDeltaY(DeltaIndex, 0)
  849.     If Page(YNext, XNext) <> 2 Then
  850.       If Page(YNext, XNext) = 0 Then
  851.         XNext = XNext + HexDeltaX(DeltaIndex, 0)
  852.         YNext = YNext + HexDeltaY(DeltaIndex, 0)
  853.         If XNext < 0 Then
  854.           Adjacency = Adjacency + 1
  855.         Else
  856.           If XNext > MaxX Then
  857.             Adjacency = Adjacency + 1
  858.           Else
  859.             If YNext < 0 Then
  860.               Adjacency = Adjacency + 1
  861.             Else
  862.               If YNext > MaxY Then
  863.                 Adjacency = Adjacency + 1
  864.               Else
  865.                 If Page(YNext, XNext) = 1 Then
  866.                   Adjacency = Adjacency + 1
  867.                 End If
  868.               End If
  869.             End If
  870.           End If
  871.         End If
  872.       End If
  873.     End If
  874.   Next DeltaIndex
  875. End Sub
  876.  
  877. Private Sub HexGenerateMaze(Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumColumns As Integer, NumRows As Integer, Seed() As Byte)
  878.   Dim ColumnNum As Integer
  879.   Dim DeltaIndex1 As Integer
  880.   Dim DeltaIndex2 As Integer
  881.   Dim PassageFound As Integer
  882.   Dim RN(7) As Integer
  883.   Dim RNIndex1 As Integer
  884.   Dim RNIndex2 As Integer
  885.   Dim RowNum As Integer
  886.   Dim SearchComplete As Integer
  887.   Dim StackHead As Integer
  888.   Dim TemInt As Integer
  889.   Dim X As Integer
  890.   Dim XMod8 As Byte
  891.   Dim XNext As Integer
  892.   Dim Y As Integer
  893.   Dim YMod4 As Byte
  894.   Dim YNext As Integer
  895.  
  896.   RN(0) = Seed(0) + 1
  897.   RN(1) = Seed(1) + 1
  898.   RN(2) = Seed(2) + 1
  899.   RN(3) = Seed(3) + 1
  900.   RN(4) = Seed(4) + 1
  901.   RN(5) = Seed(5) + 1
  902.   RN(6) = Seed(6) + 1
  903.   RN(7) = Seed(7) + 1
  904.   YMod4 = 1
  905.   For Y = 0 To MaxY
  906.     If YMod4 = 1 Then
  907.       XMod8 = 1
  908.       For X = 0 To MaxX
  909.         If (((XMod8 = 0) And (Y <> 0) And (Y <> MaxY)) Or (XMod8 = 3) Or (XMod8 = 4) Or (XMod8 = 5)) Then
  910.           Page(Y, X) = 0
  911.         Else
  912.           Page(Y, X) = 2
  913.         End If
  914.         XMod8 = XMod8 + 1
  915.         If XMod8 >= 8 Then XMod8 = 0
  916.       Next X
  917.     Else
  918.       If YMod4 = 0 Or YMod4 = 2 Then
  919.         XMod8 = 1
  920.         For X = 0 To MaxX
  921.           If (XMod8 = 2) Or (XMod8 = 6) Then
  922.             Page(Y, X) = 0
  923.           Else
  924.             Page(Y, X) = 2
  925.           End If
  926.           XMod8 = XMod8 + 1
  927.           If XMod8 >= 8 Then XMod8 = 0
  928.         Next X
  929.       Else
  930.         XMod8 = 1
  931.         For X = 0 To MaxX
  932.           If (XMod8 = 0) Or (XMod8 = 1) Or (XMod8 = 4) Or (XMod8 = 7) Then
  933.             Page(Y, X) = 0
  934.           Else
  935.             Page(Y, X) = 2
  936.           End If
  937.           XMod8 = XMod8 + 1
  938.           If XMod8 >= 8 Then XMod8 = 0
  939.         Next X
  940.       End If
  941.     End If
  942.     YMod4 = YMod4 + 1
  943.     If YMod4 >= 4 Then YMod4 = 0
  944.   Next Y
  945.   ColumnNum = RN(0)
  946.   RNIndex1 = 0
  947.   RNIndex2 = 1
  948.   Do While (RNIndex2 < 8)
  949.     TemInt = RN(RNIndex2)
  950.     RN(RNIndex1) = TemInt
  951.     ColumnNum = ColumnNum + TemInt
  952.     If ColumnNum >= 727 Then ColumnNum = ColumnNum - 727
  953.     RNIndex1 = RNIndex2
  954.     RNIndex2 = RNIndex2 + 1
  955.   Loop
  956.   RN(7) = ColumnNum
  957.   ColumnNum = ColumnNum Mod NumColumns
  958.   X = 4 * ColumnNum + 3
  959.   RowNum = RN(0)
  960.   RNIndex1 = 0
  961.   RNIndex2 = 1
  962.   Do While (RNIndex2 < 8)
  963.     TemInt = RN(RNIndex2)
  964.     RN(RNIndex1) = TemInt
  965.     RowNum = RowNum + TemInt
  966.     If RowNum >= 727 Then RowNum = RowNum - 727
  967.     RNIndex1 = RNIndex2
  968.     RNIndex2 = RNIndex2 + 1
  969.   Loop
  970.   RN(7) = RowNum
  971.   If ColumnNum Mod 2 Then
  972.     RowNum = RowNum Mod (NumRows - 1)
  973.     Y = 4 * RowNum + 4
  974.   Else
  975.     RowNum = RowNum Mod NumRows
  976.     Y = 4 * RowNum + 2
  977.   End If
  978.   Page(Y, X) = 2
  979.   StackHead = -1
  980.   Do
  981.     DeltaIndex1 = 0
  982.     Do
  983.       DeltaIndex2 = RN(0)
  984.       RNIndex1 = 0
  985.       RNIndex2 = 1
  986.       Do While (RNIndex2 < 8)
  987.         TemInt = RN(RNIndex2)
  988.         RN(RNIndex1) = TemInt
  989.         DeltaIndex2 = DeltaIndex2 + TemInt
  990.         If DeltaIndex2 >= 727 Then DeltaIndex2 = DeltaIndex2 - 727
  991.         RNIndex1 = RNIndex2
  992.         RNIndex2 = RNIndex2 + 1
  993.       Loop
  994.       RN(7) = DeltaIndex2
  995.     Loop While DeltaIndex2 >= 720
  996.     PassageFound = False
  997.     SearchComplete = False
  998.     Do While (Not SearchComplete)
  999.       Do While ((DeltaIndex1 < 6) And (Not PassageFound))
  1000.         XNext = X + 2 * HexDeltaX(DeltaIndex1, DeltaIndex2)
  1001.         If XNext <= 0 Then
  1002.           DeltaIndex1 = DeltaIndex1 + 1
  1003.         Else
  1004.           If XNext > MaxX Then
  1005.             DeltaIndex1 = DeltaIndex1 + 1
  1006.           Else
  1007.             YNext = Y + 2 * HexDeltaY(DeltaIndex1, DeltaIndex2)
  1008.             If YNext <= 0 Then
  1009.               DeltaIndex1 = DeltaIndex1 + 1
  1010.             Else
  1011.               If YNext > MaxY Then
  1012.                 DeltaIndex1 = DeltaIndex1 + 1
  1013.               Else
  1014.                 If Page(YNext, XNext) = 0 Then
  1015.                   PassageFound = True
  1016.                 Else
  1017.                   DeltaIndex1 = DeltaIndex1 + 1
  1018.                 End If
  1019.               End If
  1020.             End If
  1021.           End If
  1022.         End If
  1023.       Loop
  1024.       If Not PassageFound Then
  1025.         If StackHead >= 0 Then
  1026.           DeltaIndex1 = Stack(StackHead).Index1
  1027.           DeltaIndex2 = Stack(StackHead).Index2
  1028.           X = X - 2 * HexDeltaX(DeltaIndex1, DeltaIndex2)
  1029.           Y = Y - 2 * HexDeltaY(DeltaIndex1, DeltaIndex2)
  1030.           StackHead = StackHead - 1
  1031.           DeltaIndex1 = DeltaIndex1 + 1
  1032.         End If
  1033.       End If
  1034.       If ((PassageFound) Or ((StackHead = -1) And (DeltaIndex1 >= 6))) Then
  1035.         SearchComplete = True
  1036.       Else
  1037.         SearchComplete = False
  1038.       End If
  1039.     Loop
  1040.     If PassageFound Then
  1041.       StackHead = StackHead + 1
  1042.       Stack(StackHead).Index1 = DeltaIndex1
  1043.       Stack(StackHead).Index2 = DeltaIndex2
  1044.       Page(YNext, XNext) = 2
  1045.       Page((Y + YNext) \ 2, (X + XNext) \ 2) = 2
  1046.       X = XNext
  1047.       Y = YNext
  1048.     End If
  1049.   Loop While StackHead <> -1
  1050.   Page(0, 3) = 1
  1051.   Page(MaxY, MaxX - 3) = 2
  1052. End Sub
  1053.  
  1054. Private Sub HexSelectMaze(Seed As String, Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumRoomsInMaze As Integer, NumColumns As Integer, NumRows As Integer, SecondsForMazeSelection As Double)
  1055.   Dim Adjacency As Integer
  1056.   Dim Counter0 As Byte
  1057.   Dim Counter1 As Byte
  1058.   Dim Counter2 As Byte
  1059.   Dim Counter3 As Byte
  1060.   Dim Counter4 As Byte
  1061.   Dim Counter5 As Byte
  1062.   Dim Counter6 As Byte
  1063.   Dim Counter7 As Byte
  1064.   Dim ElapsedTime As Double
  1065.   Dim MinAdjacency As Integer
  1066.   Dim NumRoomsInSolution As Integer
  1067.   Dim NumRoomsInSolutionAtMin As Integer
  1068.   Dim RN(7) As Integer
  1069.   Dim RNIndex1 As Integer
  1070.   Dim RNIndex2 As Integer
  1071.   Dim SeedByte(7) As Byte
  1072.   Dim SeedByteAtMin(7) As Byte
  1073.   Dim SeedLength As Integer
  1074.   Dim StartTime As Double
  1075.  
  1076.   SeedLength = Len(Seed)
  1077.   If SeedLength > 8 Then SeedLength = 8
  1078.   RNIndex1 = 0
  1079.   For RNIndex2 = 1 To SeedLength
  1080.     RN(RNIndex1) = Asc(Mid$(Seed, RNIndex2, 1)) Mod 10
  1081.     RNIndex1 = RNIndex1 + 1
  1082.   Next RNIndex2
  1083.   RNIndex2 = 7
  1084.   Do While (RNIndex1 > 0)
  1085.     RNIndex1 = RNIndex1 - 1
  1086.     RN(RNIndex2) = RN(RNIndex1)
  1087.     RNIndex2 = RNIndex2 - 1
  1088.   Loop
  1089.   Do While (RNIndex2 >= 0)
  1090.     RN(RNIndex2) = 8
  1091.     RNIndex2 = RNIndex2 - 1
  1092.   Loop
  1093.   Counter0 = RN(0)
  1094.   Counter1 = RN(1)
  1095.   Counter2 = RN(2)
  1096.   Counter3 = RN(3)
  1097.   Counter4 = RN(4)
  1098.   Counter5 = RN(5)
  1099.   Counter6 = RN(6)
  1100.   Counter7 = RN(7)
  1101.   Call Hash(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  1102.   MinAdjacency = 4 * NumRoomsInMaze + 1
  1103.   NumRoomsInSolutionAtMin = 0
  1104.   SeedByteAtMin(0) = Counter0
  1105.   SeedByteAtMin(1) = Counter1
  1106.   SeedByteAtMin(2) = Counter2
  1107.   SeedByteAtMin(3) = Counter3
  1108.   SeedByteAtMin(4) = Counter4
  1109.   SeedByteAtMin(5) = Counter5
  1110.   SeedByteAtMin(6) = Counter6
  1111.   SeedByteAtMin(7) = Counter7
  1112.   StartTime = Timer
  1113.   Do
  1114.     SeedByte(0) = Counter0
  1115.     SeedByte(1) = Counter1
  1116.     SeedByte(2) = Counter2
  1117.     SeedByte(3) = Counter3
  1118.     SeedByte(4) = Counter4
  1119.     SeedByte(5) = Counter5
  1120.     SeedByte(6) = Counter6
  1121.     SeedByte(7) = Counter7
  1122.     Call HexGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByte())
  1123.     Call HexSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  1124.     If 3 * NumRoomsInSolution >= NumRoomsInMaze Then
  1125.       If Adjacency < MinAdjacency Then
  1126.         MinAdjacency = Adjacency
  1127.         NumRoomsInSolutionAtMin = NumRoomsInSolution
  1128.         SeedByteAtMin(0) = SeedByte(0)
  1129.         SeedByteAtMin(1) = SeedByte(1)
  1130.         SeedByteAtMin(2) = SeedByte(2)
  1131.         SeedByteAtMin(3) = SeedByte(3)
  1132.         SeedByteAtMin(4) = SeedByte(4)
  1133.         SeedByteAtMin(5) = SeedByte(5)
  1134.         SeedByteAtMin(6) = SeedByte(6)
  1135.         SeedByteAtMin(7) = SeedByte(7)
  1136.       Else
  1137.         If Adjacency = MinAdjacency Then
  1138.           If NumRoomsInSolution > NumRoomsInSolutionAtMin Then
  1139.             NumRoomsInSolutionAtMin = NumRoomsInSolution
  1140.             SeedByteAtMin(0) = SeedByte(0)
  1141.             SeedByteAtMin(1) = SeedByte(1)
  1142.             SeedByteAtMin(2) = SeedByte(2)
  1143.             SeedByteAtMin(3) = SeedByte(3)
  1144.             SeedByteAtMin(4) = SeedByte(4)
  1145.             SeedByteAtMin(5) = SeedByte(5)
  1146.             SeedByteAtMin(6) = SeedByte(6)
  1147.             SeedByteAtMin(7) = SeedByte(7)
  1148.           End If
  1149.         End If
  1150.       End If
  1151.     End If
  1152.     Call Increment(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  1153.     ElapsedTime = Timer - StartTime
  1154.   Loop While ((ElapsedTime >= 0#) And (ElapsedTime < SecondsForMazeSelection))
  1155.   Call HexGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByteAtMin())
  1156.   Call HexSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  1157. End Sub
  1158.  
  1159. Private Sub HexOutputMaze()
  1160.   Dim ObjectNum As Byte
  1161.   Dim Radians As Double
  1162.   Dim RadiansPerDegree As Double
  1163.   Dim SingleRectangle(3) As VertexRec
  1164.   Dim SingleTriangle(2) As VertexRec
  1165.   Dim TemDouble1 As Double
  1166.   Dim TemDouble2 As Double
  1167.   Dim TemDouble3 As Double
  1168.   Dim TemDouble4 As Double
  1169.   Dim Triangle(3, 2) As VertexRec
  1170.   Dim VertexNum As Byte
  1171.   Dim XMod8 As Byte
  1172.   Dim X0 As Double
  1173.   Dim X1 As Double
  1174.   Dim X2 As Double
  1175.   Dim X3 As Double
  1176.   Dim Y0 As Double
  1177.   Dim Y1 As Double
  1178.   Dim Y2 As Double
  1179.   Dim Y3 As Double
  1180.  
  1181.   Select Case State
  1182.     Case 0
  1183.       Text1.Text = ""
  1184.       ScaleMode = 1
  1185.       If (Resize) Then
  1186.         TemDouble1 = ScaleWidth - VScroll1.Width
  1187.         TemDouble2 = MinWallLengthInInches
  1188.         TemDouble2 = 1440# * TemDouble2
  1189.         TemDouble3 = RelativeWidthOfWall
  1190.         NumColumns = Int(2# * (TemDouble1 / TemDouble2 - 2# - TemDouble3 / Sqrt3) / 3# + 1#)
  1191.         If NumColumns Mod 2 = 0 Then NumColumns = NumColumns - 1
  1192.         If NumColumns < 3 Then NumColumns = 3
  1193.         TemDouble1 = ScaleHeight - Text1.Height
  1194.         TemDouble2 = ScaleWidth - VScroll1.Width
  1195.         ScaleMode = 3
  1196.         TemDouble3 = NumColumns
  1197.         TemDouble4 = RelativeWidthOfWall
  1198.         NumRows = Int(((TemDouble1 / TemDouble2) * (3# * (TemDouble3 - 1#) / 2# + 2# + TemDouble4 / Sqrt3) - TemDouble4) / Sqrt3)
  1199.         If NumRows < 2 Then NumRows = 2
  1200.         Tilt = 90 - VScroll1.Value
  1201.         MaxX = 8 * (NumColumns \ 2) + 6
  1202.         MaxY = 4 * NumRows
  1203.         NumRoomsInMaze = NumRows * NumColumns - (NumColumns \ 2)
  1204.         ReDim ComputerPage(MaxY, MaxX)
  1205.         ReDim UserPage(MaxY, MaxX)
  1206.         ReDim Stack(NumRoomsInMaze)
  1207.         Call HexSelectMaze(Seed, ComputerPage(), MaxX, MaxY, Stack(), NumRoomsInMaze, NumColumns, NumRows, SecondsForMazeSelection)
  1208.         For UserX = 0 To MaxX
  1209.           For UserY = 0 To MaxY
  1210.             If ComputerPage(UserY, UserX) = 0 Then
  1211.               UserPage(UserY, UserX) = 0
  1212.             Else
  1213.               UserPage(UserY, UserX) = 2
  1214.             End If
  1215.           Next UserY
  1216.         Next UserX
  1217.         UserX = 3
  1218.         UserXRelative = 1#
  1219.         UserY = 2
  1220.         UserYRelative = Sqrt3 / 2#
  1221.         UserPage(UserY, UserX) = 1
  1222.         Resize = False
  1223.       End If
  1224.       If (Paint) Then
  1225.         ScaleMode = 3
  1226.         Cls
  1227.         RadiansPerDegree = Atn(1#) / 45#
  1228.         Radians = Tilt * RadiansPerDegree
  1229.         SinTilt = Sin(Radians)
  1230.         CosTilt = Cos(Radians)
  1231.         TemDouble1 = NumColumns
  1232.         XMax = 3# * (TemDouble1 - 1#) / 2# + 2# + RelativeWidthOfWall / Sqrt3
  1233.         TemDouble1 = ScaleWidth - VScroll1.Width
  1234.         PixelsPerX = (TemDouble1 - 1#) / (XMax * (XMax / (XMax - RelativeHeightOfWall)))
  1235.         XOffset = (XMax / 2#) * (RelativeHeightOfWall / (XMax - RelativeHeightOfWall))
  1236.         TemDouble1 = NumRows
  1237.         YMax = TemDouble1 * Sqrt3 + RelativeWidthOfWall
  1238.         TemDouble1 = ScaleHeight - Text1.Height
  1239.         PixelsPerZ = (TemDouble1 - 1#) / Sqr(YMax * YMax + RelativeHeightOfWall * RelativeHeightOfWall)
  1240.         If YMax > XMax Then
  1241.           RelDistOfUserFromScreen = YMax
  1242.         Else
  1243.           RelDistOfUserFromScreen = XMax
  1244.         End If
  1245.         Paint = False
  1246.       End If
  1247.       If State = 0 Then
  1248.         State = 1
  1249.         DoEvents
  1250.         If State < 5 Then
  1251.           Timer1.Enabled = True
  1252.         End If
  1253.       End If
  1254.     Case 1
  1255.       BaseTriangle(0, 0).X = 0#
  1256.       BaseTriangle(0, 0).Y = RelativeWidthOfWall + Sqrt3 / 2#
  1257.       BaseTriangle(0, 1).X = 0#
  1258.       BaseTriangle(0, 1).Y = Sqrt3 / 2#
  1259.       BaseTriangle(0, 2).X = RelativeWidthOfWall * Sqrt3 / 2#
  1260.       BaseTriangle(0, 2).Y = (RelativeWidthOfWall + Sqrt3) / 2#
  1261.       BaseTriangle(1, 0).X = (1# - RelativeWidthOfWall / Sqrt3) / 2#
  1262.       BaseTriangle(1, 0).Y = RelativeWidthOfWall / 2#
  1263.       BaseTriangle(1, 1).X = 0.5 + RelativeWidthOfWall / Sqrt3
  1264.       BaseTriangle(1, 1).Y = 0#
  1265.       BaseTriangle(1, 2).X = BaseTriangle(1, 1).X
  1266.       BaseTriangle(1, 2).Y = RelativeWidthOfWall
  1267.       BaseTriangle(2, 0).X = 1.5
  1268.       BaseTriangle(2, 0).Y = RelativeWidthOfWall
  1269.       BaseTriangle(2, 1).X = 1.5
  1270.       BaseTriangle(2, 1).Y = 0#
  1271.       BaseTriangle(2, 2).X = 1.5 * (1# + RelativeWidthOfWall / Sqrt3)
  1272.       BaseTriangle(2, 2).Y = RelativeWidthOfWall / 2#
  1273.       BaseTriangle(3, 0).X = 2# - RelativeWidthOfWall / (2# * Sqrt3)
  1274.       BaseTriangle(3, 0).Y = BaseTriangle(0, 2).Y
  1275.       BaseTriangle(3, 1).X = 2# + RelativeWidthOfWall / Sqrt3
  1276.       BaseTriangle(3, 1).Y = BaseTriangle(0, 1).Y
  1277.       BaseTriangle(3, 2).X = BaseTriangle(3, 1).X
  1278.       BaseTriangle(3, 2).Y = BaseTriangle(0, 0).Y
  1279.       BaseRectangle(0, 0).X = BaseTriangle(0, 2).X
  1280.       BaseRectangle(0, 0).Y = BaseTriangle(0, 2).Y
  1281.       BaseRectangle(0, 1).X = BaseTriangle(1, 1).X
  1282.       BaseRectangle(0, 1).Y = Sqrt3
  1283.       BaseRectangle(0, 2).X = BaseTriangle(1, 0).X
  1284.       BaseRectangle(0, 2).Y = Sqrt3 + RelativeWidthOfWall / 2#
  1285.       BaseRectangle(0, 3).X = BaseTriangle(0, 0).X
  1286.       BaseRectangle(0, 3).Y = BaseTriangle(0, 0).Y
  1287.       BaseRectangle(1, 0).X = BaseTriangle(0, 1).X
  1288.       BaseRectangle(1, 0).Y = BaseTriangle(0, 1).Y
  1289.       BaseRectangle(1, 1).X = BaseTriangle(1, 0).X
  1290.       BaseRectangle(1, 1).Y = BaseTriangle(1, 0).Y
  1291.       BaseRectangle(1, 2).X = BaseTriangle(1, 2).X
  1292.       BaseRectangle(1, 2).Y = BaseTriangle(1, 2).Y
  1293.       BaseRectangle(1, 3).X = BaseTriangle(0, 2).X
  1294.       BaseRectangle(1, 3).Y = BaseTriangle(0, 2).Y
  1295.       BaseRectangle(2, 0).X = BaseTriangle(1, 1).X
  1296.       BaseRectangle(2, 0).Y = BaseTriangle(1, 1).Y
  1297.       BaseRectangle(2, 1).X = BaseTriangle(2, 1).X
  1298.       BaseRectangle(2, 1).Y = BaseTriangle(2, 1).Y
  1299.       BaseRectangle(2, 2).X = BaseTriangle(2, 0).X
  1300.       BaseRectangle(2, 2).Y = BaseTriangle(2, 0).Y
  1301.       BaseRectangle(2, 3).X = BaseTriangle(1, 2).X
  1302.       BaseRectangle(2, 3).Y = BaseTriangle(1, 2).Y
  1303.       BaseRectangle(3, 0).X = BaseTriangle(2, 2).X
  1304.       BaseRectangle(3, 0).Y = BaseTriangle(2, 2).Y
  1305.       BaseRectangle(3, 1).X = BaseTriangle(3, 1).X
  1306.       BaseRectangle(3, 1).Y = BaseTriangle(3, 1).Y
  1307.       BaseRectangle(3, 2).X = BaseTriangle(3, 0).X
  1308.       BaseRectangle(3, 2).Y = BaseTriangle(3, 0).Y
  1309.       BaseRectangle(3, 3).X = BaseTriangle(2, 0).X
  1310.       BaseRectangle(3, 3).Y = BaseTriangle(2, 0).Y
  1311.       BaseRectangle(4, 0).X = BaseTriangle(3, 1).X
  1312.       BaseRectangle(4, 0).Y = BaseTriangle(3, 1).Y
  1313.       BaseRectangle(4, 1).X = BaseTriangle(3, 1).X + (BaseTriangle(2, 1).X - BaseTriangle(1, 1).X)
  1314.       BaseRectangle(4, 1).Y = BaseTriangle(3, 1).Y
  1315.       BaseRectangle(4, 2).X = BaseRectangle(4, 1).X
  1316.       BaseRectangle(4, 2).Y = BaseTriangle(3, 2).Y
  1317.       BaseRectangle(4, 3).X = BaseTriangle(3, 2).X
  1318.       BaseRectangle(4, 3).Y = BaseTriangle(3, 2).Y
  1319.       BaseRectangle(5, 0).X = BaseRectangle(0, 1).X + (BaseTriangle(2, 1).X - BaseTriangle(1, 1).X)
  1320.       BaseRectangle(5, 0).Y = BaseRectangle(0, 1).Y
  1321.       BaseRectangle(5, 1).X = BaseTriangle(3, 0).X
  1322.       BaseRectangle(5, 1).Y = BaseTriangle(3, 0).Y
  1323.       BaseRectangle(5, 2).X = BaseTriangle(3, 2).X
  1324.       BaseRectangle(5, 2).Y = BaseTriangle(3, 2).Y
  1325.       BaseRectangle(5, 3).X = BaseRectangle(0, 2).X + (BaseTriangle(2, 2).X - BaseTriangle(1, 0).X)
  1326.       BaseRectangle(5, 3).Y = BaseRectangle(0, 2).Y
  1327.       Rectangle(0, 0).X = BaseTriangle(1, 1).X
  1328.       Rectangle(0, 0).Y = BaseTriangle(1, 1).Y
  1329.       Rectangle(0, 1).X = XMax - BaseTriangle(1, 1).X
  1330.       Rectangle(0, 1).Y = BaseTriangle(1, 1).Y
  1331.       Rectangle(0, 2).X = XMax - BaseTriangle(1, 2).X
  1332.       Rectangle(0, 2).Y = BaseTriangle(1, 2).Y
  1333.       Rectangle(0, 3).X = BaseTriangle(1, 2).X
  1334.       Rectangle(0, 3).Y = BaseTriangle(1, 2).Y
  1335.       Rectangle(1, 0).X = BaseTriangle(0, 1).X
  1336.       Rectangle(1, 0).Y = BaseTriangle(0, 1).Y
  1337.       Rectangle(1, 1).X = XMax - BaseTriangle(0, 1).X
  1338.       Rectangle(1, 1).Y = BaseTriangle(0, 1).Y
  1339.       Rectangle(1, 2).X = XMax - BaseTriangle(1, 2).X
  1340.       Rectangle(1, 2).Y = BaseTriangle(1, 2).Y
  1341.       Rectangle(1, 3).X = BaseTriangle(1, 2).X
  1342.       Rectangle(1, 3).Y = BaseTriangle(1, 2).Y
  1343.       Rectangle(2, 0).X = BaseTriangle(0, 1).X
  1344.       Rectangle(2, 0).Y = BaseTriangle(0, 1).Y
  1345.       Rectangle(2, 1).X = XMax - BaseTriangle(0, 1).X
  1346.       Rectangle(2, 1).Y = BaseTriangle(0, 1).Y
  1347.       Rectangle(2, 2).X = XMax - BaseTriangle(0, 0).X
  1348.       Rectangle(2, 2).Y = BaseTriangle(0, 0).Y
  1349.       Rectangle(2, 3).X = BaseTriangle(0, 0).X
  1350.       Rectangle(2, 3).Y = BaseTriangle(0, 0).Y
  1351.       Rectangle(3, 0).X = BaseTriangle(0, 0).X
  1352.       Rectangle(3, 0).Y = BaseTriangle(0, 0).Y
  1353.       Rectangle(3, 1).X = XMax - BaseTriangle(0, 0).X
  1354.       Rectangle(3, 1).Y = BaseTriangle(0, 0).Y
  1355.       Rectangle(3, 2).X = XMax - BaseRectangle(0, 1).X
  1356.       Rectangle(3, 2).Y = BaseRectangle(0, 1).Y
  1357.       Rectangle(3, 3).X = BaseRectangle(0, 1).X
  1358.       Rectangle(3, 3).Y = BaseRectangle(0, 1).Y
  1359.       Y = 0
  1360.       State = 2
  1361.       DoEvents
  1362.       If State < 5 Then
  1363.         Timer1.Enabled = True
  1364.       End If
  1365.     Case 2
  1366.       If UsePalette Then
  1367.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1368.         NumRealized = RealizePalette(frm3DMaze.hDC)
  1369.       End If
  1370.       If (Y <= MaxY - 1) Then
  1371.         If Y > 0 Then
  1372.           X0 = Rectangle(0, 0).X
  1373.           Y0 = Rectangle(0, 0).Y
  1374.           X1 = Rectangle(0, 1).X
  1375.           Y1 = Rectangle(0, 1).Y
  1376.           X2 = Rectangle(0, 2).X
  1377.           Y2 = Rectangle(0, 2).Y
  1378.           X3 = Rectangle(0, 3).X
  1379.           Y3 = Rectangle(0, 3).Y
  1380.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1381.           X0 = Rectangle(1, 0).X
  1382.           Y0 = Rectangle(1, 0).Y
  1383.           X1 = Rectangle(1, 1).X
  1384.           Y1 = Rectangle(1, 1).Y
  1385.           X2 = Rectangle(1, 2).X
  1386.           Y2 = Rectangle(1, 2).Y
  1387.           X3 = Rectangle(1, 3).X
  1388.           Y3 = Rectangle(1, 3).Y
  1389.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1390.         End If
  1391.         X0 = Rectangle(2, 0).X
  1392.         Y0 = Rectangle(2, 0).Y
  1393.         X1 = Rectangle(2, 1).X
  1394.         Y1 = Rectangle(2, 1).Y
  1395.         X2 = Rectangle(2, 2).X
  1396.         Y2 = Rectangle(2, 2).Y
  1397.         X3 = Rectangle(2, 3).X
  1398.         Y3 = Rectangle(2, 3).Y
  1399.         Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1400.         If Y < MaxY - 4 Then
  1401.           X0 = Rectangle(3, 0).X
  1402.           Y0 = Rectangle(3, 0).Y
  1403.           X1 = Rectangle(3, 1).X
  1404.           Y1 = Rectangle(3, 1).Y
  1405.           X2 = Rectangle(3, 2).X
  1406.           Y2 = Rectangle(3, 2).Y
  1407.           X3 = Rectangle(3, 3).X
  1408.           Y3 = Rectangle(3, 3).Y
  1409.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1410.         End If
  1411.         For ObjectNum = 0 To 3
  1412.           For VertexNum = 0 To 3
  1413.             Rectangle(ObjectNum, VertexNum).Y = Rectangle(ObjectNum, VertexNum).Y + Sqrt3
  1414.           Next VertexNum
  1415.         Next ObjectNum
  1416.         Y = Y + 4
  1417.       Else
  1418.         Rectangle(0, 0).X = BaseTriangle(1, 0).X
  1419.         Rectangle(0, 0).Y = BaseTriangle(1, 0).Y
  1420.         Rectangle(0, 1).X = BaseTriangle(1, 1).X
  1421.         Rectangle(0, 1).Y = BaseTriangle(1, 1).Y
  1422.         Rectangle(0, 2).X = BaseTriangle(2, 1).X
  1423.         Rectangle(0, 2).Y = BaseTriangle(2, 1).Y
  1424.         Rectangle(0, 3).X = BaseTriangle(2, 2).X
  1425.         Rectangle(0, 3).Y = BaseTriangle(2, 2).Y
  1426.         Rectangle(1, 0).X = BaseTriangle(0, 1).X
  1427.         Rectangle(1, 0).Y = BaseTriangle(0, 1).Y
  1428.         Rectangle(1, 1).X = BaseTriangle(1, 0).X
  1429.         Rectangle(1, 1).Y = BaseTriangle(1, 0).Y
  1430.         Rectangle(1, 2).X = BaseTriangle(2, 2).X
  1431.         Rectangle(1, 2).Y = BaseTriangle(2, 2).Y
  1432.         Rectangle(1, 3).X = BaseTriangle(3, 1).X
  1433.         Rectangle(1, 3).Y = BaseTriangle(3, 1).Y
  1434.         Rectangle(2, 0).X = BaseTriangle(0, 0).X
  1435.         Rectangle(2, 0).Y = BaseTriangle(0, 0).Y
  1436.         Rectangle(2, 1).X = BaseTriangle(0, 1).X
  1437.         Rectangle(2, 1).Y = BaseTriangle(0, 1).Y
  1438.         Rectangle(2, 2).X = BaseTriangle(3, 1).X
  1439.         Rectangle(2, 2).Y = BaseTriangle(3, 1).Y
  1440.         Rectangle(2, 3).X = BaseTriangle(3, 2).X
  1441.         Rectangle(2, 3).Y = BaseTriangle(3, 2).Y
  1442.         X = 0
  1443.         State = 3
  1444.       End If
  1445.       If UsePalette Then
  1446.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1447.       End If
  1448.       DoEvents
  1449.       If State < 5 Then
  1450.         Timer1.Enabled = True
  1451.       End If
  1452.     Case 3
  1453.       If UsePalette Then
  1454.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1455.         NumRealized = RealizePalette(frm3DMaze.hDC)
  1456.       End If
  1457.       If X <= MaxX Then
  1458.         For ObjectNum = 0 To 2
  1459.           X0 = Rectangle(ObjectNum, 0).X
  1460.           Y0 = Rectangle(ObjectNum, 0).Y
  1461.           X1 = Rectangle(ObjectNum, 1).X
  1462.           Y1 = Rectangle(ObjectNum, 1).Y
  1463.           X2 = Rectangle(ObjectNum, 2).X
  1464.           Y2 = Rectangle(ObjectNum, 2).Y
  1465.           X3 = Rectangle(ObjectNum, 3).X
  1466.           Y3 = Rectangle(ObjectNum, 3).Y
  1467.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1468.           X0 = Rectangle(ObjectNum, 0).X
  1469.           Y0 = YMax - Rectangle(ObjectNum, 0).Y
  1470.           X1 = Rectangle(ObjectNum, 1).X
  1471.           Y1 = YMax - Rectangle(ObjectNum, 1).Y
  1472.           X2 = Rectangle(ObjectNum, 2).X
  1473.           Y2 = YMax - Rectangle(ObjectNum, 2).Y
  1474.           X3 = Rectangle(ObjectNum, 3).X
  1475.           Y3 = YMax - Rectangle(ObjectNum, 3).Y
  1476.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1477.           For VertexNum = 0 To 3
  1478.             Rectangle(ObjectNum, VertexNum).X = Rectangle(ObjectNum, VertexNum).X + 3#
  1479.           Next VertexNum
  1480.         Next ObjectNum
  1481.         X = X + 8
  1482.       Else
  1483.         YMod4 = 0
  1484.         YOffset = 0#
  1485.         Y = 0
  1486.         State = 4
  1487.       End If
  1488.       If UsePalette Then
  1489.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1490.       End If
  1491.       DoEvents
  1492.       If State < 5 Then
  1493.         Timer1.Enabled = True
  1494.       End If
  1495.     Case 4
  1496.       If UsePalette Then
  1497.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1498.         NumRealized = RealizePalette(frm3DMaze.hDC)
  1499.       End If
  1500.       If Y <= MaxY Then
  1501.         Select Case YMod4
  1502.           Case 0
  1503.             XMod8 = 0
  1504.             For ObjectNum = 1 To 2
  1505.               For VertexNum = 0 To 2
  1506.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1507.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1508.               Next VertexNum
  1509.             Next ObjectNum
  1510.             For VertexNum = 0 To 3
  1511.               Rectangle(2, VertexNum).X = BaseRectangle(2, VertexNum).X
  1512.               Rectangle(2, VertexNum).Y = BaseRectangle(2, VertexNum).Y + YOffset
  1513.             Next VertexNum
  1514.             For X = 0 To MaxX
  1515.               Select Case XMod8
  1516.                 Case 2
  1517.                   SingleTriangle(0).X = Triangle(1, 0).X
  1518.                   SingleTriangle(0).Y = Triangle(1, 0).Y
  1519.                   SingleTriangle(1).X = Triangle(1, 1).X
  1520.                   SingleTriangle(1).Y = Triangle(1, 1).Y
  1521.                   SingleTriangle(2).X = Triangle(1, 2).X
  1522.                   SingleTriangle(2).Y = Triangle(1, 2).Y
  1523.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSWNNEColor)
  1524.                 Case 4
  1525.                   SingleTriangle(0).X = Triangle(2, 0).X
  1526.                   SingleTriangle(0).Y = Triangle(2, 0).Y
  1527.                   SingleTriangle(1).X = Triangle(2, 1).X
  1528.                   SingleTriangle(1).Y = Triangle(2, 1).Y
  1529.                   SingleTriangle(2).X = Triangle(2, 2).X
  1530.                   SingleTriangle(2).Y = Triangle(2, 2).Y
  1531.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSENNWColor)
  1532.                 Case Else
  1533.               End Select
  1534.               XMod8 = XMod8 + 1
  1535.               If XMod8 >= 8 Then
  1536.                 XMod8 = 0
  1537.                 For ObjectNum = 1 To 2
  1538.                   For VertexNum = 0 To 2
  1539.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1540.                   Next VertexNum
  1541.                 Next ObjectNum
  1542.                 For VertexNum = 0 To 3
  1543.                   Rectangle(2, VertexNum).X = Rectangle(2, VertexNum).X + 3#
  1544.                 Next VertexNum
  1545.               End If
  1546.             Next X
  1547.             XMod8 = 0
  1548.             For ObjectNum = 1 To 2
  1549.               For VertexNum = 0 To 2
  1550.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1551.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1552.               Next VertexNum
  1553.             Next ObjectNum
  1554.             For VertexNum = 0 To 3
  1555.               Rectangle(2, VertexNum).X = BaseRectangle(2, VertexNum).X
  1556.               Rectangle(2, VertexNum).Y = BaseRectangle(2, VertexNum).Y + YOffset
  1557.             Next VertexNum
  1558.             For X = 0 To MaxX
  1559.               Select Case XMod8
  1560.                 Case 2
  1561.                   SingleTriangle(0).X = Triangle(1, 0).X
  1562.                   SingleTriangle(0).Y = Triangle(1, 0).Y
  1563.                   SingleTriangle(1).X = Triangle(1, 1).X
  1564.                   SingleTriangle(1).Y = Triangle(1, 1).Y
  1565.                   SingleTriangle(2).X = Triangle(1, 2).X
  1566.                   SingleTriangle(2).Y = Triangle(1, 2).Y
  1567.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSENWColor)
  1568.                 Case 3
  1569.                   If ComputerPage(Y, X) = 0 Then
  1570.                     SingleRectangle(0).X = Rectangle(2, 0).X
  1571.                     SingleRectangle(0).Y = Rectangle(2, 0).Y
  1572.                     SingleRectangle(1).X = Rectangle(2, 1).X
  1573.                     SingleRectangle(1).Y = Rectangle(2, 1).Y
  1574.                     SingleRectangle(2).X = Rectangle(2, 2).X
  1575.                     SingleRectangle(2).Y = Rectangle(2, 2).Y
  1576.                     SingleRectangle(3).X = Rectangle(2, 3).X
  1577.                     SingleRectangle(3).Y = Rectangle(2, 3).Y
  1578.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  1579.                   End If
  1580.                 Case 4
  1581.                   SingleTriangle(0).X = Triangle(2, 0).X
  1582.                   SingleTriangle(0).Y = Triangle(2, 0).Y
  1583.                   SingleTriangle(1).X = Triangle(2, 1).X
  1584.                   SingleTriangle(1).Y = Triangle(2, 1).Y
  1585.                   SingleTriangle(2).X = Triangle(2, 2).X
  1586.                   SingleTriangle(2).Y = Triangle(2, 2).Y
  1587.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSWNEColor)
  1588.                 Case Else
  1589.               End Select
  1590.               XMod8 = XMod8 + 1
  1591.               If XMod8 >= 8 Then
  1592.                 XMod8 = 0
  1593.                 For ObjectNum = 1 To 2
  1594.                   For VertexNum = 0 To 2
  1595.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1596.                   Next VertexNum
  1597.                 Next ObjectNum
  1598.                 For VertexNum = 0 To 3
  1599.                   Rectangle(2, VertexNum).X = Rectangle(2, VertexNum).X + 3#
  1600.                 Next VertexNum
  1601.               End If
  1602.             Next X
  1603.           Case 1
  1604.             XMod8 = 0
  1605.             For ObjectNum = 1 To 3 Step 2
  1606.               For VertexNum = 0 To 3
  1607.                 Rectangle(ObjectNum, VertexNum).X = BaseRectangle(ObjectNum, VertexNum).X
  1608.                 Rectangle(ObjectNum, VertexNum).Y = BaseRectangle(ObjectNum, VertexNum).Y + YOffset
  1609.               Next VertexNum
  1610.             Next ObjectNum
  1611.             For X = 0 To MaxX
  1612.               Select Case XMod8
  1613.                 Case 1
  1614.                   If ComputerPage(Y, X) = 0 Then
  1615.                     SingleRectangle(0).X = Rectangle(1, 0).X
  1616.                     SingleRectangle(0).Y = Rectangle(1, 0).Y
  1617.                     SingleRectangle(1).X = Rectangle(1, 1).X
  1618.                     SingleRectangle(1).Y = Rectangle(1, 1).Y
  1619.                     SingleRectangle(2).X = Rectangle(1, 2).X
  1620.                     SingleRectangle(2).Y = Rectangle(1, 2).Y
  1621.                     SingleRectangle(3).X = Rectangle(1, 3).X
  1622.                     SingleRectangle(3).Y = Rectangle(1, 3).Y
  1623.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSWNEColor)
  1624.                   End If
  1625.                 Case 5
  1626.                   If ComputerPage(Y, X) = 0 Then
  1627.                     SingleRectangle(0).X = Rectangle(3, 0).X
  1628.                     SingleRectangle(0).Y = Rectangle(3, 0).Y
  1629.                     SingleRectangle(1).X = Rectangle(3, 1).X
  1630.                     SingleRectangle(1).Y = Rectangle(3, 1).Y
  1631.                     SingleRectangle(2).X = Rectangle(3, 2).X
  1632.                     SingleRectangle(2).Y = Rectangle(3, 2).Y
  1633.                     SingleRectangle(3).X = Rectangle(3, 3).X
  1634.                     SingleRectangle(3).Y = Rectangle(3, 3).Y
  1635.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSENWColor)
  1636.                   End If
  1637.                 Case Else
  1638.               End Select
  1639.               XMod8 = XMod8 + 1
  1640.               If XMod8 >= 8 Then
  1641.                 XMod8 = 0
  1642.                 For ObjectNum = 1 To 3 Step 2
  1643.                   For VertexNum = 0 To 3
  1644.                     Rectangle(ObjectNum, VertexNum).X = Rectangle(ObjectNum, VertexNum).X + 3#
  1645.                   Next VertexNum
  1646.                 Next ObjectNum
  1647.               End If
  1648.             Next X
  1649.           Case 2
  1650.             XMod8 = 0
  1651.             For ObjectNum = 0 To 3 Step 3
  1652.               For VertexNum = 0 To 2
  1653.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1654.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1655.               Next VertexNum
  1656.             Next ObjectNum
  1657.             For VertexNum = 0 To 3
  1658.               Rectangle(4, VertexNum).X = BaseRectangle(4, VertexNum).X
  1659.               Rectangle(4, VertexNum).Y = BaseRectangle(4, VertexNum).Y + YOffset
  1660.             Next VertexNum
  1661.             For X = 0 To MaxX
  1662.               Select Case XMod8
  1663.                 Case 0
  1664.                   SingleTriangle(0).X = Triangle(0, 0).X
  1665.                   SingleTriangle(0).Y = Triangle(0, 0).Y
  1666.                   SingleTriangle(1).X = Triangle(0, 1).X
  1667.                   SingleTriangle(1).Y = Triangle(0, 1).Y
  1668.                   SingleTriangle(2).X = Triangle(0, 2).X
  1669.                   SingleTriangle(2).Y = Triangle(0, 2).Y
  1670.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSWNNEColor)
  1671.                 Case 6
  1672.                   SingleTriangle(0).X = Triangle(3, 0).X
  1673.                   SingleTriangle(0).Y = Triangle(3, 0).Y
  1674.                   SingleTriangle(1).X = Triangle(3, 1).X
  1675.                   SingleTriangle(1).Y = Triangle(3, 1).Y
  1676.                   SingleTriangle(2).X = Triangle(3, 2).X
  1677.                   SingleTriangle(2).Y = Triangle(3, 2).Y
  1678.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSENNWColor)
  1679.                 Case Else
  1680.               End Select
  1681.               XMod8 = XMod8 + 1
  1682.               If XMod8 >= 8 Then
  1683.                 XMod8 = 0
  1684.                 For ObjectNum = 0 To 3 Step 3
  1685.                   For VertexNum = 0 To 2
  1686.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1687.                   Next VertexNum
  1688.                 Next ObjectNum
  1689.                 For VertexNum = 0 To 3
  1690.                   Rectangle(4, VertexNum).X = Rectangle(4, VertexNum).X + 3#
  1691.                 Next VertexNum
  1692.               End If
  1693.             Next X
  1694.             XMod8 = 0
  1695.             For ObjectNum = 0 To 3 Step 3
  1696.               For VertexNum = 0 To 2
  1697.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1698.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1699.               Next VertexNum
  1700.             Next ObjectNum
  1701.             For VertexNum = 0 To 3
  1702.               Rectangle(4, VertexNum).X = BaseRectangle(4, VertexNum).X
  1703.               Rectangle(4, VertexNum).Y = BaseRectangle(4, VertexNum).Y + YOffset
  1704.             Next VertexNum
  1705.             For X = 0 To MaxX
  1706.               Select Case XMod8
  1707.                 Case 0
  1708.                   SingleTriangle(0).X = Triangle(0, 0).X
  1709.                   SingleTriangle(0).Y = Triangle(0, 0).Y
  1710.                   SingleTriangle(1).X = Triangle(0, 1).X
  1711.                   SingleTriangle(1).Y = Triangle(0, 1).Y
  1712.                   SingleTriangle(2).X = Triangle(0, 2).X
  1713.                   SingleTriangle(2).Y = Triangle(0, 2).Y
  1714.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSWNEColor)
  1715.                 Case 6
  1716.                   SingleTriangle(0).X = Triangle(3, 0).X
  1717.                   SingleTriangle(0).Y = Triangle(3, 0).Y
  1718.                   SingleTriangle(1).X = Triangle(3, 1).X
  1719.                   SingleTriangle(1).Y = Triangle(3, 1).Y
  1720.                   SingleTriangle(2).X = Triangle(3, 2).X
  1721.                   SingleTriangle(2).Y = Triangle(3, 2).Y
  1722.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSENWColor)
  1723.                 Case 7
  1724.                   If ComputerPage(Y, X) = 0 Then
  1725.                     SingleRectangle(0).X = Rectangle(4, 0).X
  1726.                     SingleRectangle(0).Y = Rectangle(4, 0).Y
  1727.                     SingleRectangle(1).X = Rectangle(4, 1).X
  1728.                     SingleRectangle(1).Y = Rectangle(4, 1).Y
  1729.                     SingleRectangle(2).X = Rectangle(4, 2).X
  1730.                     SingleRectangle(2).Y = Rectangle(4, 2).Y
  1731.                     SingleRectangle(3).X = Rectangle(4, 3).X
  1732.                     SingleRectangle(3).Y = Rectangle(4, 3).Y
  1733.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  1734.                   End If
  1735.                 Case Else
  1736.               End Select
  1737.               XMod8 = XMod8 + 1
  1738.               If XMod8 >= 8 Then
  1739.                 XMod8 = 0
  1740.                 For ObjectNum = 0 To 3 Step 3
  1741.                   For VertexNum = 0 To 2
  1742.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1743.                   Next VertexNum
  1744.                 Next ObjectNum
  1745.                 For VertexNum = 0 To 3
  1746.                   Rectangle(4, VertexNum).X = Rectangle(4, VertexNum).X + 3#
  1747.                 Next VertexNum
  1748.               End If
  1749.             Next X
  1750.           Case Else
  1751.             XMod8 = 0
  1752.             For ObjectNum = 0 To 5 Step 5
  1753.               For VertexNum = 0 To 3
  1754.                 Rectangle(ObjectNum, VertexNum).X = BaseRectangle(ObjectNum, VertexNum).X
  1755.                 Rectangle(ObjectNum, VertexNum).Y = BaseRectangle(ObjectNum, VertexNum).Y + YOffset
  1756.               Next VertexNum
  1757.             Next ObjectNum
  1758.             For X = 0 To MaxX
  1759.               Select Case XMod8
  1760.                 Case 1
  1761.                   If ComputerPage(Y, X) = 0 Then
  1762.                     SingleRectangle(0).X = Rectangle(0, 0).X
  1763.                     SingleRectangle(0).Y = Rectangle(0, 0).Y
  1764.                     SingleRectangle(1).X = Rectangle(0, 1).X
  1765.                     SingleRectangle(1).Y = Rectangle(0, 1).Y
  1766.                     SingleRectangle(2).X = Rectangle(0, 2).X
  1767.                     SingleRectangle(2).Y = Rectangle(0, 2).Y
  1768.                     SingleRectangle(3).X = Rectangle(0, 3).X
  1769.                     SingleRectangle(3).Y = Rectangle(0, 3).Y
  1770.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSENWColor)
  1771.                   End If
  1772.                 Case 5
  1773.                   If ComputerPage(Y, X) = 0 Then
  1774.                     SingleRectangle(0).X = Rectangle(5, 0).X
  1775.                     SingleRectangle(0).Y = Rectangle(5, 0).Y
  1776.                     SingleRectangle(1).X = Rectangle(5, 1).X
  1777.                     SingleRectangle(1).Y = Rectangle(5, 1).Y
  1778.                     SingleRectangle(2).X = Rectangle(5, 2).X
  1779.                     SingleRectangle(2).Y = Rectangle(5, 2).Y
  1780.                     SingleRectangle(3).X = Rectangle(5, 3).X
  1781.                     SingleRectangle(3).Y = Rectangle(5, 3).Y
  1782.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSWNEColor)
  1783.                   End If
  1784.                 Case Else
  1785.               End Select
  1786.               XMod8 = XMod8 + 1
  1787.               If XMod8 >= 8 Then
  1788.                 XMod8 = 0
  1789.                 For ObjectNum = 0 To 5 Step 5
  1790.                   For VertexNum = 0 To 3
  1791.                     Rectangle(ObjectNum, VertexNum).X = Rectangle(ObjectNum, VertexNum).X + 3#
  1792.                   Next VertexNum
  1793.                 Next ObjectNum
  1794.               End If
  1795.             Next X
  1796.         End Select
  1797.         YMod4 = YMod4 + 1
  1798.         If YMod4 >= 4 Then
  1799.           YMod4 = 0
  1800.           YOffset = YOffset + Sqrt3
  1801.         End If
  1802.         Y = Y + 1
  1803.       Else
  1804.         State = 5
  1805.       End If
  1806.       If UsePalette Then
  1807.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1808.       End If
  1809.       DoEvents
  1810.       If State < 5 Then
  1811.         Timer1.Enabled = True
  1812.       Else
  1813.         If State = 5 Then
  1814.           AlreadyPainting = False
  1815.           Call HexDisplayUserMoves(MaxX, MaxY, UserPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1816.           If SolutionDisplayed Then
  1817.             Call HexDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1818.             Text1.Text = ""
  1819.           Else
  1820.             If UserHasSolved Then
  1821.               Text1.Text = "Congratulations!"
  1822.             Else
  1823.               Text1.Text = "Use Home, Up Arrow, PgUp, End, Down Arrow, and PgDn to solve."
  1824.             End If
  1825.           End If
  1826.           mnuActionItem(1).Enabled = True
  1827.           mnuActionItem(2).Enabled = True
  1828.         End If
  1829.       End If
  1830.     Case Else
  1831.       DoEvents
  1832.   End Select
  1833. End Sub
  1834.  
  1835. Private Sub SqrDisplaySolution(MaxY As Integer, Page() As Byte, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  1836.   Dim DeltaIndex As Byte
  1837.   Dim OldPaletteHandle As Long
  1838.   Dim PathFound As Integer
  1839.   Dim TemDouble As Double
  1840.   Dim X As Integer
  1841.   Dim XNext As Integer
  1842.   Dim XPrevious As Integer
  1843.   Dim XRelative As Double
  1844.   Dim XRelativeNext As Double
  1845.   Dim Y As Integer
  1846.   Dim YNext As Integer
  1847.   Dim YPrevious As Integer
  1848.   Dim YRelative As Double
  1849.   Dim YRelativeNext As Double
  1850.   If UsePalette Then
  1851.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1852.     NumRealized = RealizePalette(frm3DMaze.hDC)
  1853.   End If
  1854.   XRelative = (RelativeWidthOfWall + 1#) / 2#
  1855.   YRelative = (RelativeWidthOfWall + 1#) / 2#
  1856.   CurrentColor = SolutionColor
  1857.   Call DrawLine(XRelative, RelativeWidthOfWall / 2#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1858.   XPrevious = 1
  1859.   YPrevious = -1
  1860.   X = 1
  1861.   Y = 1
  1862.   Do
  1863.     PathFound = False
  1864.     DeltaIndex = 0
  1865.     Do While (Not PathFound)
  1866.       XNext = X + SqrDeltaX(DeltaIndex, 0)
  1867.       YNext = Y + SqrDeltaY(DeltaIndex, 0)
  1868.       If Page(YNext, XNext) = 1 Then
  1869.         XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  1870.         YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  1871.         If (XNext <> XPrevious) Or (YNext <> YPrevious) Then
  1872.           PathFound = True
  1873.         Else
  1874.           DeltaIndex = DeltaIndex + 1
  1875.         End If
  1876.       Else
  1877.         DeltaIndex = DeltaIndex + 1
  1878.       End If
  1879.     Loop
  1880.     If YNext < MaxY Then
  1881.       TemDouble = SqrDeltaX(DeltaIndex, 0)
  1882.       XRelativeNext = XRelative + TemDouble
  1883.       TemDouble = SqrDeltaY(DeltaIndex, 0)
  1884.       YRelativeNext = YRelative + TemDouble
  1885.       Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1886.     Else
  1887.       Call DrawLine(XRelative, YRelative, XRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1888.     End If
  1889.     XPrevious = X
  1890.     YPrevious = Y
  1891.     X = XNext
  1892.     Y = YNext
  1893.     XRelative = XRelativeNext
  1894.     YRelative = YRelativeNext
  1895.   Loop While YNext < MaxY
  1896.   If UsePalette Then
  1897.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1898.   End If
  1899. End Sub
  1900.  
  1901. Private Sub SqrDisplayUserMoves(MaxX As Integer, MaxY As Integer, Page() As Byte, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  1902.   Dim DeltaIndex As Byte
  1903.   Dim OldPaletteHandle As Long
  1904.   Dim TemDouble As Double
  1905.   Dim X As Integer
  1906.   Dim XNext As Integer
  1907.   Dim XNextNext As Integer
  1908.   Dim XRelative As Double
  1909.   Dim XRelativeNext As Double
  1910.   Dim Y As Integer
  1911.   Dim YNext As Integer
  1912.   Dim YNextNext As Integer
  1913.   Dim YRelative As Double
  1914.   Dim YRelativeNext As Double
  1915.   If UsePalette Then
  1916.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1917.     NumRealized = RealizePalette(frm3DMaze.hDC)
  1918.   End If
  1919.   Y = 1
  1920.   YRelative = (RelativeWidthOfWall + 1#) / 2#
  1921.   Do While (Y < MaxY)
  1922.     X = 1
  1923.     XRelative = (RelativeWidthOfWall + 1#) / 2#
  1924.     Do While (X < MaxX)
  1925.       If ((Page(Y, X) = 1) Or (Page(Y, X) = 3)) Then
  1926.         For DeltaIndex = 0 To 3
  1927.           XNext = X + SqrDeltaX(DeltaIndex, 0)
  1928.           YNext = Y + SqrDeltaY(DeltaIndex, 0)
  1929.           If Page(YNext, XNext) <> 0 Then
  1930.             If YNext = 0 Then
  1931.               CurrentColor = AdvanceColor
  1932.               Call DrawLine(XRelative, RelativeWidthOfWall / 2#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1933.             Else
  1934.               If YNext = MaxY Then
  1935.                 If UserHasSolved Then
  1936.                   CurrentColor = AdvanceColor
  1937.                   Call DrawLine(XRelative, YRelative, XRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1938.                 End If
  1939.               Else
  1940.                 XNextNext = XNext + SqrDeltaX(DeltaIndex, 0)
  1941.                 If XNextNext > 0 Then
  1942.                   If XNextNext < MaxX Then
  1943.                     YNextNext = YNext + SqrDeltaY(DeltaIndex, 0)
  1944.                     If YNextNext > 0 Then
  1945.                       If YNextNext < MaxY Then
  1946.                         If ((Page(YNextNext, XNextNext) = 1) Or (Page(YNextNext, XNextNext) = 3)) Then
  1947.                           If Page(Y, X) = Page(YNextNext, XNextNext) Then
  1948.                             If Page(Y, X) = 1 Then
  1949.                               CurrentColor = AdvanceColor
  1950.                             Else
  1951.                               CurrentColor = BackoutColor
  1952.                             End If
  1953.                           Else
  1954.                             CurrentColor = BackoutColor
  1955.                           End If
  1956.                           TemDouble = SqrDeltaX(DeltaIndex, 0)
  1957.                           XRelativeNext = XRelative + TemDouble / 2#
  1958.                           TemDouble = SqrDeltaY(DeltaIndex, 0)
  1959.                           YRelativeNext = YRelative + TemDouble / 2#
  1960.                           Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1961.                         End If
  1962.                        End If
  1963.                     End If
  1964.                   End If
  1965.                 End If
  1966.               End If
  1967.             End If
  1968.           End If
  1969.         Next DeltaIndex
  1970.       End If
  1971.       XRelative = XRelative + 1#
  1972.       X = X + 2
  1973.     Loop
  1974.     YRelative = YRelative + 1#
  1975.     Y = Y + 2
  1976.   Loop
  1977.   If UsePalette Then
  1978.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1979.   End If
  1980. End Sub
  1981.  
  1982. Private Sub SqrSolveMaze(Stack() As StackRec, Page() As Byte, NumRoomsInSolution As Integer, Adjacency As Integer, MaxX As Integer, MaxY As Integer)
  1983.   Dim DeltaIndex As Byte
  1984.   Dim PassageFound As Integer
  1985.   Dim StackHead As Integer
  1986.   Dim X As Integer
  1987.   Dim XNext As Integer
  1988.   Dim Y As Integer
  1989.   Dim YNext As Integer
  1990.  
  1991.   NumRoomsInSolution = 1
  1992.   Adjacency = 0
  1993.   X = 1
  1994.   Y = 1
  1995.   StackHead = -1
  1996.   Page(Y, X) = 1
  1997.   Do
  1998.     DeltaIndex = 0
  1999.     PassageFound = False
  2000.     Do
  2001.       Do While ((DeltaIndex < 4) And (Not PassageFound))
  2002.         XNext = X + SqrDeltaX(DeltaIndex, 0)
  2003.         YNext = Y + SqrDeltaY(DeltaIndex, 0)
  2004.         If Page(YNext, XNext) = 2 Then
  2005.           PassageFound = True
  2006.         Else
  2007.           DeltaIndex = DeltaIndex + 1
  2008.         End If
  2009.       Loop
  2010.       If Not PassageFound Then
  2011.         DeltaIndex = Stack(StackHead).Index1
  2012.         Page(Y, X) = 2
  2013.         X = X - SqrDeltaX(DeltaIndex, 0)
  2014.         Y = Y - SqrDeltaY(DeltaIndex, 0)
  2015.         Page(Y, X) = 2
  2016.         X = X - SqrDeltaX(DeltaIndex, 0)
  2017.         Y = Y - SqrDeltaY(DeltaIndex, 0)
  2018.         StackHead = StackHead - 1
  2019.         DeltaIndex = DeltaIndex + 1
  2020.       End If
  2021.     Loop While Not PassageFound
  2022.     Page(YNext, XNext) = 1
  2023.     XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  2024.     YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  2025.     If YNext <= MaxY Then
  2026.       StackHead = StackHead + 1
  2027.       Stack(StackHead).Index1 = DeltaIndex
  2028.       Page(YNext, XNext) = 1
  2029.       X = XNext
  2030.       Y = YNext
  2031.     End If
  2032.   Loop While YNext < MaxY
  2033.   X = MaxX - 1
  2034.   Y = MaxY - 1
  2035.   Adjacency = 0
  2036.   Do While (StackHead >= 0)
  2037.     For DeltaIndex = 0 To 3
  2038.       XNext = X + SqrDeltaX(DeltaIndex, 0)
  2039.       YNext = Y + SqrDeltaY(DeltaIndex, 0)
  2040.       If Page(YNext, XNext) <> 1 Then
  2041.         If Page(YNext, XNext) = 0 Then
  2042.           XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  2043.           YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  2044.           If XNext < 0 Then
  2045.             Adjacency = Adjacency + 1
  2046.           Else
  2047.             If XNext > MaxX Then
  2048.               Adjacency = Adjacency + 1
  2049.             Else
  2050.               If YNext < 0 Then
  2051.                 Adjacency = Adjacency + 1
  2052.               Else
  2053.                 If YNext > MaxY Then
  2054.                   Adjacency = Adjacency + 1
  2055.                 Else
  2056.                   If Page(YNext, XNext) = 1 Then
  2057.                     Adjacency = Adjacency + 1
  2058.                   End If
  2059.                 End If
  2060.               End If
  2061.             End If
  2062.           End If
  2063.         End If
  2064.       End If
  2065.     Next DeltaIndex
  2066.     X = X - 2 * SqrDeltaX(Stack(StackHead).Index1, 0)
  2067.     Y = Y - 2 * SqrDeltaY(Stack(StackHead).Index1, 0)
  2068.     StackHead = StackHead - 1
  2069.     NumRoomsInSolution = NumRoomsInSolution + 1
  2070.   Loop
  2071.   For DeltaIndex = 0 To 3
  2072.     XNext = X + SqrDeltaX(DeltaIndex, 0)
  2073.     YNext = X + SqrDeltaY(DeltaIndex, 0)
  2074.     If Page(YNext, XNext) <> 2 Then
  2075.       If Page(YNext, XNext) = 0 Then
  2076.         XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  2077.         YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  2078.         If XNext < 0 Then
  2079.           Adjacency = Adjacency + 1
  2080.         Else
  2081.           If XNext > MaxX Then
  2082.             Adjacency = Adjacency + 1
  2083.           Else
  2084.             If YNext < 0 Then
  2085.               Adjacency = Adjacency + 1
  2086.             Else
  2087.               If YNext > MaxY Then
  2088.                 Adjacency = Adjacency + 1
  2089.               Else
  2090.                 If Page(YNext, XNext) = 1 Then
  2091.                   Adjacency = Adjacency + 1
  2092.                 End If
  2093.               End If
  2094.             End If
  2095.           End If
  2096.         End If
  2097.       End If
  2098.     End If
  2099.   Next DeltaIndex
  2100. End Sub
  2101.  
  2102. Private Sub SqrGenerateMaze(Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumColumns As Integer, NumRows As Integer, Seed() As Byte)
  2103.   Dim DeltaIndex1 As Byte
  2104.   Dim DeltaIndex2 As Integer
  2105.   Dim Digit As Integer
  2106.   Dim DigitNum As Byte
  2107.   Dim PassageFound As Integer
  2108.   Dim RN(7) As Integer
  2109.   Dim RNIndex1 As Integer
  2110.   Dim RNIndex2 As Integer
  2111.   Dim SearchComplete As Integer
  2112.   Dim StackHead As Integer
  2113.   Dim Sum As Integer
  2114.   Dim TemInt As Integer
  2115.   Dim X As Integer
  2116.   Dim XNext As Integer
  2117.   Dim Y As Integer
  2118.   Dim YNext As Integer
  2119.  
  2120.   RN(0) = Seed(0) + 1
  2121.   RN(1) = Seed(1) + 1
  2122.   RN(2) = Seed(2) + 1
  2123.   RN(3) = Seed(3) + 1
  2124.   RN(4) = Seed(4) + 1
  2125.   RN(5) = Seed(5) + 1
  2126.   RN(6) = Seed(6) + 1
  2127.   RN(7) = Seed(7) + 1
  2128.   For Y = 0 To MaxY
  2129.     For X = 0 To MaxX
  2130.       Page(Y, X) = 0
  2131.     Next X
  2132.   Next Y
  2133.   Sum = 0
  2134.   For DigitNum = 1 To 3
  2135.     Digit = RN(0)
  2136.     RNIndex1 = 0
  2137.     RNIndex2 = 1
  2138.     Do While (RNIndex2 < 8)
  2139.       TemInt = RN(RNIndex2)
  2140.       RN(RNIndex1) = TemInt
  2141.       Digit = Digit + TemInt
  2142.       If Digit >= 29 Then Digit = Digit - 29
  2143.       RNIndex1 = RNIndex2
  2144.       RNIndex2 = RNIndex2 + 1
  2145.     Loop
  2146.     RN(7) = Digit
  2147.     Sum = 29 * Sum + Digit
  2148.   Next DigitNum
  2149.   X = 2 * (Sum Mod NumColumns) + 1
  2150.   Sum = 0
  2151.   For DigitNum = 1 To 3
  2152.     Digit = RN(0)
  2153.     RNIndex1 = 0
  2154.     RNIndex2 = 1
  2155.     Do While (RNIndex2 < 8)
  2156.       TemInt = RN(RNIndex2)
  2157.       RN(RNIndex1) = TemInt
  2158.       Digit = Digit + TemInt
  2159.       If Digit >= 29 Then Digit = Digit - 29
  2160.       RNIndex1 = RNIndex2
  2161.       RNIndex2 = RNIndex2 + 1
  2162.     Loop
  2163.     RN(7) = Digit
  2164.     Sum = 29 * Sum + Digit
  2165.   Next DigitNum
  2166.   Y = 2 * (Sum Mod NumRows) + 1
  2167.   Page(Y, X) = 2
  2168.   StackHead = -1
  2169.   Do
  2170.     DeltaIndex1 = 0
  2171.     Do
  2172.       DeltaIndex2 = RN(0)
  2173.       RNIndex1 = 0
  2174.       RNIndex2 = 1
  2175.       Do While (RNIndex2 < 8)
  2176.         TemInt = RN(RNIndex2)
  2177.         RN(RNIndex1) = TemInt
  2178.         DeltaIndex2 = DeltaIndex2 + TemInt
  2179.         If DeltaIndex2 >= 29 Then DeltaIndex2 = DeltaIndex2 - 29
  2180.         RNIndex1 = RNIndex2
  2181.         RNIndex2 = RNIndex2 + 1
  2182.       Loop
  2183.       RN(7) = DeltaIndex2
  2184.     Loop While DeltaIndex2 >= 24
  2185.     PassageFound = False
  2186.     SearchComplete = False
  2187.     Do While (Not SearchComplete)
  2188.       Do While ((DeltaIndex1 < 4) And (Not PassageFound))
  2189.         XNext = X + 2 * SqrDeltaX(DeltaIndex1, DeltaIndex2)
  2190.         If XNext <= 0 Then
  2191.           DeltaIndex1 = DeltaIndex1 + 1
  2192.         Else
  2193.           If XNext > MaxX Then
  2194.             DeltaIndex1 = DeltaIndex1 + 1
  2195.           Else
  2196.             YNext = Y + 2 * SqrDeltaY(DeltaIndex1, DeltaIndex2)
  2197.             If YNext <= 0 Then
  2198.               DeltaIndex1 = DeltaIndex1 + 1
  2199.             Else
  2200.               If YNext > MaxY Then
  2201.                 DeltaIndex1 = DeltaIndex1 + 1
  2202.               Else
  2203.                 If Page(YNext, XNext) = 0 Then
  2204.                   PassageFound = True
  2205.                 Else
  2206.                   DeltaIndex1 = DeltaIndex1 + 1
  2207.                 End If
  2208.               End If
  2209.             End If
  2210.           End If
  2211.         End If
  2212.       Loop
  2213.       If Not PassageFound Then
  2214.         If StackHead >= 0 Then
  2215.           DeltaIndex1 = Stack(StackHead).Index1
  2216.           DeltaIndex2 = Stack(StackHead).Index2
  2217.           X = X - 2 * SqrDeltaX(DeltaIndex1, DeltaIndex2)
  2218.           Y = Y - 2 * SqrDeltaY(DeltaIndex1, DeltaIndex2)
  2219.           StackHead = StackHead - 1
  2220.           DeltaIndex1 = DeltaIndex1 + 1
  2221.         End If
  2222.       End If
  2223.       If ((PassageFound) Or ((StackHead = -1) And (DeltaIndex1 >= 4))) Then
  2224.         SearchComplete = True
  2225.       Else
  2226.         SearchComplete = False
  2227.       End If
  2228.     Loop
  2229.     If PassageFound Then
  2230.       StackHead = StackHead + 1
  2231.       Stack(StackHead).Index1 = DeltaIndex1
  2232.       Stack(StackHead).Index2 = DeltaIndex2
  2233.       Page(YNext, XNext) = 2
  2234.       Page((Y + YNext) \ 2, (X + XNext) \ 2) = 2
  2235.       X = XNext
  2236.       Y = YNext
  2237.     End If
  2238.   Loop While StackHead <> -1
  2239.   Page(0, 1) = 1
  2240.   Page(MaxY, MaxX - 1) = 2
  2241. End Sub
  2242.  
  2243. Private Sub SqrSelectMaze(Seed As String, Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumRoomsInMaze As Integer, NumColumns As Integer, NumRows As Integer, SecondsForMazeSelection As Double)
  2244.   Dim Adjacency As Integer
  2245.   Dim Counter0 As Byte
  2246.   Dim Counter1 As Byte
  2247.   Dim Counter2 As Byte
  2248.   Dim Counter3 As Byte
  2249.   Dim Counter4 As Byte
  2250.   Dim Counter5 As Byte
  2251.   Dim Counter6 As Byte
  2252.   Dim Counter7 As Byte
  2253.   Dim ElapsedTime As Double
  2254.   Dim MinAdjacency As Integer
  2255.   Dim NumRoomsInSolution As Integer
  2256.   Dim NumRoomsInSolutionAtMin As Integer
  2257.   Dim RN(7) As Integer
  2258.   Dim RNIndex1 As Integer
  2259.   Dim RNIndex2 As Integer
  2260.   Dim SeedByte(7) As Byte
  2261.   Dim SeedByteAtMin(7) As Byte
  2262.   Dim SeedLength As Integer
  2263.   Dim StartTime As Double
  2264.  
  2265.   SeedLength = Len(Seed)
  2266.   If SeedLength > 8 Then SeedLength = 8
  2267.   RNIndex1 = 0
  2268.   For RNIndex2 = 1 To SeedLength
  2269.     RN(RNIndex1) = Asc(Mid$(Seed, RNIndex2, 1)) Mod 10
  2270.     RNIndex1 = RNIndex1 + 1
  2271.   Next RNIndex2
  2272.   RNIndex2 = 7
  2273.   Do While (RNIndex1 > 0)
  2274.     RNIndex1 = RNIndex1 - 1
  2275.     RN(RNIndex2) = RN(RNIndex1)
  2276.     RNIndex2 = RNIndex2 - 1
  2277.   Loop
  2278.   Do While (RNIndex2 >= 0)
  2279.     RN(RNIndex2) = 8
  2280.     RNIndex2 = RNIndex2 - 1
  2281.   Loop
  2282.   Counter0 = RN(0)
  2283.   Counter1 = RN(1)
  2284.   Counter2 = RN(2)
  2285.   Counter3 = RN(3)
  2286.   Counter4 = RN(4)
  2287.   Counter5 = RN(5)
  2288.   Counter6 = RN(6)
  2289.   Counter7 = RN(7)
  2290.   Call Hash(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  2291.   MinAdjacency = 2 * NumRoomsInMaze + 1
  2292.   NumRoomsInSolutionAtMin = 0
  2293.   SeedByteAtMin(0) = Counter0
  2294.   SeedByteAtMin(1) = Counter1
  2295.   SeedByteAtMin(2) = Counter2
  2296.   SeedByteAtMin(3) = Counter3
  2297.   SeedByteAtMin(4) = Counter4
  2298.   SeedByteAtMin(5) = Counter5
  2299.   SeedByteAtMin(6) = Counter6
  2300.   SeedByteAtMin(7) = Counter7
  2301.   StartTime = Timer
  2302.   Do
  2303.     SeedByte(0) = Counter0
  2304.     SeedByte(1) = Counter1
  2305.     SeedByte(2) = Counter2
  2306.     SeedByte(3) = Counter3
  2307.     SeedByte(4) = Counter4
  2308.     SeedByte(5) = Counter5
  2309.     SeedByte(6) = Counter6
  2310.     SeedByte(7) = Counter7
  2311.     Call SqrGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByte())
  2312.     Call SqrSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  2313.     If 3 * NumRoomsInSolution >= NumRoomsInMaze Then
  2314.       If Adjacency < MinAdjacency Then
  2315.         MinAdjacency = Adjacency
  2316.         NumRoomsInSolutionAtMin = NumRoomsInSolution
  2317.         SeedByteAtMin(0) = SeedByte(0)
  2318.         SeedByteAtMin(1) = SeedByte(1)
  2319.         SeedByteAtMin(2) = SeedByte(2)
  2320.         SeedByteAtMin(3) = SeedByte(3)
  2321.         SeedByteAtMin(4) = SeedByte(4)
  2322.         SeedByteAtMin(5) = SeedByte(5)
  2323.         SeedByteAtMin(6) = SeedByte(6)
  2324.         SeedByteAtMin(7) = SeedByte(7)
  2325.       Else
  2326.         If Adjacency = MinAdjacency Then
  2327.           If NumRoomsInSolution > NumRoomsInSolutionAtMin Then
  2328.             NumRoomsInSolutionAtMin = NumRoomsInSolution
  2329.             SeedByteAtMin(0) = SeedByte(0)
  2330.             SeedByteAtMin(1) = SeedByte(1)
  2331.             SeedByteAtMin(2) = SeedByte(2)
  2332.             SeedByteAtMin(3) = SeedByte(3)
  2333.             SeedByteAtMin(4) = SeedByte(4)
  2334.             SeedByteAtMin(5) = SeedByte(5)
  2335.             SeedByteAtMin(6) = SeedByte(6)
  2336.             SeedByteAtMin(7) = SeedByte(7)
  2337.           End If
  2338.         End If
  2339.       End If
  2340.     End If
  2341.     Call Increment(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  2342.     ElapsedTime = Timer - StartTime
  2343.   Loop While ((ElapsedTime >= 0#) And (ElapsedTime < SecondsForMazeSelection))
  2344.   Call SqrGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByteAtMin())
  2345.   Call SqrSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  2346. End Sub
  2347.  
  2348. Private Sub SqrOutputMaze()
  2349.   Dim ObjectNum As Byte
  2350.   Dim Radians As Double
  2351.   Dim RadiansPerDegree As Double
  2352.   Dim SingleRectangle(3) As VertexRec
  2353.   Dim SingleTriangle(2) As VertexRec
  2354.   Dim TemDouble1 As Double
  2355.   Dim TemDouble2 As Double
  2356.   Dim TemDouble3 As Double
  2357.   Dim TemDouble4 As Double
  2358.   Dim Triangle(3, 2) As VertexRec
  2359.   Dim VertexNum As Byte
  2360.   Dim XMod8 As Byte
  2361.   Dim X0 As Double
  2362.   Dim X1 As Double
  2363.   Dim X2 As Double
  2364.   Dim X3 As Double
  2365.   Dim Y0 As Double
  2366.   Dim Y1 As Double
  2367.   Dim Y2 As Double
  2368.   Dim Y3 As Double
  2369.  
  2370.   Select Case State
  2371.     Case 0
  2372.       Text1.Text = ""
  2373.       ScaleMode = 1
  2374.       If (Resize) Then
  2375.         TemDouble1 = ScaleWidth - VScroll1.Width
  2376.         TemDouble2 = MinWallLengthInInches
  2377.         TemDouble2 = 1440# * TemDouble2
  2378.         TemDouble3 = RelativeWidthOfWall
  2379.         NumColumns = Int(TemDouble1 / TemDouble2 - TemDouble3)
  2380.         If NumColumns < 2 Then NumColumns = 2
  2381.         TemDouble1 = ScaleHeight - Text1.Height
  2382.         TemDouble2 = ScaleWidth - VScroll1.Width
  2383.         ScaleMode = 3
  2384.         TemDouble3 = NumColumns
  2385.         NumRows = Int((TemDouble1 * TemDouble3) / TemDouble2)
  2386.         If NumRows < 2 Then NumRows = 2
  2387.         Tilt = 90 - VScroll1.Value
  2388.         MaxX = 2 * NumColumns
  2389.         MaxY = 2 * NumRows
  2390.         NumRoomsInMaze = NumRows * NumColumns
  2391.         ReDim ComputerPage(MaxY, MaxX)
  2392.         ReDim UserPage(MaxY, MaxX)
  2393.         ReDim Stack(NumRoomsInMaze)
  2394.         Call SqrSelectMaze(Seed, ComputerPage(), MaxX, MaxY, Stack(), NumRoomsInMaze, NumColumns, NumRows, SecondsForMazeSelection)
  2395.         For UserX = 0 To MaxX
  2396.           For UserY = 0 To MaxY
  2397.             If ComputerPage(UserY, UserX) = 0 Then
  2398.               UserPage(UserY, UserX) = 0
  2399.             Else
  2400.               UserPage(UserY, UserX) = 2
  2401.             End If
  2402.           Next UserY
  2403.         Next UserX
  2404.         UserX = 1
  2405.         UserXRelative = (RelativeWidthOfWall + 1#) / 2#
  2406.         UserY = 1
  2407.         UserYRelative = (RelativeWidthOfWall + 1#) / 2#
  2408.         UserPage(UserY, UserX) = 1
  2409.         Resize = False
  2410.       End If
  2411.       If (Paint) Then
  2412.         ScaleMode = 3
  2413.         Cls
  2414.         RadiansPerDegree = Atn(1#) / 45#
  2415.         Radians = Tilt * RadiansPerDegree
  2416.         SinTilt = Sin(Radians)
  2417.         CosTilt = Cos(Radians)
  2418.         TemDouble1 = NumColumns
  2419.         XMax = TemDouble1 + RelativeWidthOfWall
  2420.         TemDouble1 = ScaleWidth - VScroll1.Width
  2421.         PixelsPerX = (TemDouble1 - 1#) / (XMax * (XMax / (XMax - RelativeHeightOfWall)))
  2422.         XOffset = (XMax / 2#) * (RelativeHeightOfWall / (XMax - RelativeHeightOfWall))
  2423.         TemDouble1 = NumRows
  2424.         YMax = TemDouble1 + RelativeWidthOfWall
  2425.         TemDouble1 = ScaleHeight - Text1.Height
  2426.         PixelsPerZ = (TemDouble1 - 1#) / Sqr(YMax * YMax + RelativeHeightOfWall * RelativeHeightOfWall)
  2427.         If YMax > XMax Then
  2428.           RelDistOfUserFromScreen = YMax
  2429.         Else
  2430.           RelDistOfUserFromScreen = XMax
  2431.         End If
  2432.         Paint = False
  2433.       End If
  2434.       If State = 0 Then
  2435.         State = 1
  2436.         DoEvents
  2437.         If State < 5 Then
  2438.           Timer1.Enabled = True
  2439.         End If
  2440.       End If
  2441.     Case 1
  2442.       BaseRectangle(0, 0).X = 0#
  2443.       BaseRectangle(0, 0).Y = 0#
  2444.       BaseRectangle(0, 1).X = RelativeWidthOfWall
  2445.       BaseRectangle(0, 1).Y = 0#
  2446.       BaseRectangle(0, 2).X = RelativeWidthOfWall
  2447.       BaseRectangle(0, 2).Y = RelativeWidthOfWall
  2448.       BaseRectangle(0, 3).X = 0#
  2449.       BaseRectangle(0, 3).Y = RelativeWidthOfWall
  2450.       BaseRectangle(1, 0).X = RelativeWidthOfWall
  2451.       BaseRectangle(1, 0).Y = 0#
  2452.       BaseRectangle(1, 1).X = 1#
  2453.       BaseRectangle(1, 1).Y = 0#
  2454.       BaseRectangle(1, 2).X = 1#
  2455.       BaseRectangle(1, 2).Y = RelativeWidthOfWall
  2456.       BaseRectangle(1, 3).X = RelativeWidthOfWall
  2457.       BaseRectangle(1, 3).Y = RelativeWidthOfWall
  2458.       BaseRectangle(2, 0).X = RelativeWidthOfWall
  2459.       BaseRectangle(2, 0).Y = RelativeWidthOfWall
  2460.       BaseRectangle(2, 1).X = 1#
  2461.       BaseRectangle(2, 1).Y = RelativeWidthOfWall
  2462.       BaseRectangle(2, 2).X = 1#
  2463.       BaseRectangle(2, 2).Y = 1#
  2464.       BaseRectangle(2, 3).X = RelativeWidthOfWall
  2465.       BaseRectangle(2, 3).Y = 1#
  2466.       BaseRectangle(3, 0).X = 0#
  2467.       BaseRectangle(3, 0).Y = RelativeWidthOfWall
  2468.       BaseRectangle(3, 1).X = RelativeWidthOfWall
  2469.       BaseRectangle(3, 1).Y = RelativeWidthOfWall
  2470.       BaseRectangle(3, 2).X = RelativeWidthOfWall
  2471.       BaseRectangle(3, 2).Y = 1#
  2472.       BaseRectangle(3, 3).X = 0#
  2473.       BaseRectangle(3, 3).Y = 1#
  2474.       Rectangle(0, 0).X = 0#
  2475.       Rectangle(0, 0).Y = 0#
  2476.       Rectangle(0, 1).X = XMax
  2477.       Rectangle(0, 1).Y = 0#
  2478.       Rectangle(0, 2).X = XMax
  2479.       Rectangle(0, 2).Y = YMax
  2480.       Rectangle(0, 3).X = 0#
  2481.       Rectangle(0, 3).Y = YMax
  2482.       If UsePalette Then
  2483.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2484.         NumRealized = RealizePalette(frm3DMaze.hDC)
  2485.       End If
  2486.       X0 = Rectangle(0, 0).X
  2487.       Y0 = Rectangle(0, 0).Y
  2488.       X1 = Rectangle(0, 1).X
  2489.       Y1 = Rectangle(0, 1).Y
  2490.       X2 = Rectangle(0, 2).X
  2491.       Y2 = Rectangle(0, 2).Y
  2492.       X3 = Rectangle(0, 3).X
  2493.       Y3 = Rectangle(0, 3).Y
  2494.       Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  2495.       Y = 0
  2496.       YOffset = 0
  2497.       State = 4
  2498.       If UsePalette Then
  2499.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2500.       End If
  2501.       DoEvents
  2502.       If State < 5 Then
  2503.         Timer1.Enabled = True
  2504.       End If
  2505.     Case 4
  2506.       If UsePalette Then
  2507.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2508.         NumRealized = RealizePalette(frm3DMaze.hDC)
  2509.       End If
  2510.       If Y <= MaxY Then
  2511.         For VertexNum = 0 To 3
  2512.           Rectangle(0, VertexNum).X = BaseRectangle(0, VertexNum).X
  2513.           Rectangle(0, VertexNum).Y = BaseRectangle(0, VertexNum).Y + YOffset
  2514.         Next VertexNum
  2515.         X = 0
  2516.         Do While X <= MaxX
  2517.           If ComputerPage(Y, X) = 0 Then
  2518.             SingleRectangle(0).X = Rectangle(0, 0).X
  2519.             SingleRectangle(0).Y = Rectangle(0, 0).Y
  2520.             SingleRectangle(1).X = Rectangle(0, 1).X
  2521.             SingleRectangle(1).Y = Rectangle(0, 1).Y
  2522.             SingleRectangle(2).X = Rectangle(0, 2).X
  2523.             SingleRectangle(2).Y = Rectangle(0, 2).Y
  2524.             SingleRectangle(3).X = Rectangle(0, 3).X
  2525.             SingleRectangle(3).Y = Rectangle(0, 3).Y
  2526.             Call OutputLeftRight(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen)
  2527.           End If
  2528.           For VertexNum = 0 To 3
  2529.             Rectangle(0, VertexNum).X = Rectangle(0, VertexNum).X + 1
  2530.           Next VertexNum
  2531.           X = X + 2
  2532.         Loop
  2533.         For VertexNum = 0 To 3
  2534.           Rectangle(0, VertexNum).X = BaseRectangle(0, VertexNum).X
  2535.           Rectangle(0, VertexNum).Y = BaseRectangle(0, VertexNum).Y + YOffset
  2536.         Next VertexNum
  2537.         For VertexNum = 0 To 3
  2538.           Rectangle(1, VertexNum).X = BaseRectangle(1, VertexNum).X
  2539.           Rectangle(1, VertexNum).Y = BaseRectangle(1, VertexNum).Y + YOffset
  2540.         Next VertexNum
  2541.         X = 0
  2542.         Do While X <= MaxX
  2543.           If ComputerPage(Y, X) = 0 Then
  2544.             SingleRectangle(0).X = Rectangle(0, 0).X
  2545.             SingleRectangle(0).Y = Rectangle(0, 0).Y
  2546.             SingleRectangle(1).X = Rectangle(0, 1).X
  2547.             SingleRectangle(1).Y = Rectangle(0, 1).Y
  2548.             SingleRectangle(2).X = Rectangle(0, 2).X
  2549.             SingleRectangle(2).Y = Rectangle(0, 2).Y
  2550.             SingleRectangle(3).X = Rectangle(0, 3).X
  2551.             SingleRectangle(3).Y = Rectangle(0, 3).Y
  2552.             Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  2553.           End If
  2554.           For VertexNum = 0 To 3
  2555.             Rectangle(0, VertexNum).X = Rectangle(0, VertexNum).X + 1
  2556.           Next VertexNum
  2557.           X = X + 1
  2558.           If X <= MaxX Then
  2559.             If ComputerPage(Y, X) = 0 Then
  2560.               SingleRectangle(0).X = Rectangle(1, 0).X
  2561.               SingleRectangle(0).Y = Rectangle(1, 0).Y
  2562.               SingleRectangle(1).X = Rectangle(1, 1).X
  2563.               SingleRectangle(1).Y = Rectangle(1, 1).Y
  2564.               SingleRectangle(2).X = Rectangle(1, 2).X
  2565.               SingleRectangle(2).Y = Rectangle(1, 2).Y
  2566.               SingleRectangle(3).X = Rectangle(1, 3).X
  2567.               SingleRectangle(3).Y = Rectangle(1, 3).Y
  2568.               Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  2569.             End If
  2570.             For VertexNum = 0 To 3
  2571.               Rectangle(1, VertexNum).X = Rectangle(1, VertexNum).X + 1
  2572.             Next VertexNum
  2573.             X = X + 1
  2574.           End If
  2575.         Loop
  2576.         Y = Y + 1
  2577.         If Y <= MaxY Then
  2578.           For VertexNum = 0 To 3
  2579.             Rectangle(3, VertexNum).X = BaseRectangle(3, VertexNum).X
  2580.             Rectangle(3, VertexNum).Y = BaseRectangle(3, VertexNum).Y + YOffset
  2581.           Next VertexNum
  2582.           X = 0
  2583.           Do While X <= MaxX
  2584.             If ComputerPage(Y, X) = 0 Then
  2585.               SingleRectangle(0).X = Rectangle(3, 0).X
  2586.               SingleRectangle(0).Y = Rectangle(3, 0).Y
  2587.               SingleRectangle(1).X = Rectangle(3, 1).X
  2588.               SingleRectangle(1).Y = Rectangle(3, 1).Y
  2589.               SingleRectangle(2).X = Rectangle(3, 2).X
  2590.               SingleRectangle(2).Y = Rectangle(3, 2).Y
  2591.               SingleRectangle(3).X = Rectangle(3, 3).X
  2592.               SingleRectangle(3).Y = Rectangle(3, 3).Y
  2593.               Call OutputLeftRight(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen)
  2594.             End If
  2595.             For VertexNum = 0 To 3
  2596.               Rectangle(3, VertexNum).X = Rectangle(3, VertexNum).X + 1
  2597.             Next VertexNum
  2598.             X = X + 2
  2599.           Loop
  2600.           For VertexNum = 0 To 3
  2601.             Rectangle(3, VertexNum).X = BaseRectangle(3, VertexNum).X
  2602.             Rectangle(3, VertexNum).Y = BaseRectangle(3, VertexNum).Y + YOffset
  2603.           Next VertexNum
  2604.           X = 0
  2605.           Do While X <= MaxX
  2606.             If ComputerPage(Y, X) = 0 Then
  2607.               SingleRectangle(0).X = Rectangle(3, 0).X
  2608.               SingleRectangle(0).Y = Rectangle(3, 0).Y
  2609.               SingleRectangle(1).X = Rectangle(3, 1).X
  2610.               SingleRectangle(1).Y = Rectangle(3, 1).Y
  2611.               SingleRectangle(2).X = Rectangle(3, 2).X
  2612.               SingleRectangle(2).Y = Rectangle(3, 2).Y
  2613.               SingleRectangle(3).X = Rectangle(3, 3).X
  2614.               SingleRectangle(3).Y = Rectangle(3, 3).Y
  2615.               Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  2616.             End If
  2617.             For VertexNum = 0 To 3
  2618.               Rectangle(3, VertexNum).X = Rectangle(3, VertexNum).X + 1
  2619.             Next VertexNum
  2620.             X = X + 2
  2621.           Loop
  2622.           Y = Y + 1
  2623.         End If
  2624.         YOffset = YOffset + 1
  2625.       Else
  2626.         State = 5
  2627.       End If
  2628.       If UsePalette Then
  2629.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2630.       End If
  2631.       DoEvents
  2632.       If State < 5 Then
  2633.         Timer1.Enabled = True
  2634.       Else
  2635.         If State = 5 Then
  2636.           AlreadyPainting = False
  2637.           Call SqrDisplayUserMoves(MaxX, MaxY, UserPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2638.           If SolutionDisplayed Then
  2639.             Call SqrDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2640.             Text1.Text = ""
  2641.           Else
  2642.             If UserHasSolved Then
  2643.               Text1.Text = "Congratulations!"
  2644.             Else
  2645.               Text1.Text = "Use the arrow keys to solve."
  2646.             End If
  2647.           End If
  2648.           mnuActionItem(1).Enabled = True
  2649.           mnuActionItem(2).Enabled = True
  2650.         End If
  2651.       End If
  2652.     Case Else
  2653.       DoEvents
  2654.   End Select
  2655. End Sub
  2656.  
  2657. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  2658.   If ((State = 5) And (Not SolutionDisplayed) And (Not UserHasSolved)) Then
  2659.     Dim DeltaIndex1 As Integer
  2660.     Dim OldPaletteHandle As Long
  2661.     Dim PassageFound As Integer
  2662.     Dim TemDouble As Double
  2663.     Dim XNext As Integer
  2664.     Dim XRelativeNext As Double
  2665.     Dim YNext As Integer
  2666.     Dim YRelativeNext As Double
  2667.     PassageFound = True
  2668.     DeltaIndex1 = -1
  2669.     If mnuStyleItem(0).Checked Then
  2670.       Select Case KeyCode
  2671.         Case vbKeyPageDown, vbKeyNumpad3
  2672.           DeltaIndex1 = 5
  2673.           KeyCode = 0
  2674.         Case vbKeyHome, vbKeyNumpad7
  2675.           DeltaIndex1 = 0
  2676.           KeyCode = 0
  2677.         Case vbKeyLeft, vbKeyNumpad4
  2678.           Beep
  2679.           KeyCode = 0
  2680.         Case vbKeyUp, vbKeyNumpad8
  2681.           DeltaIndex1 = 2
  2682.           KeyCode = 0
  2683.         Case vbKeyRight, vbKeyNumpad6
  2684.           Beep
  2685.           KeyCode = 0
  2686.         Case vbKeyDown, vbKeyNumpad2
  2687.           DeltaIndex1 = 3
  2688.           KeyCode = 0
  2689.         Case vbKeyPageUp, vbKeyNumpad9
  2690.           DeltaIndex1 = 4
  2691.           KeyCode = 0
  2692.         Case vbKeyEnd, vbKeyNumpad1
  2693.           DeltaIndex1 = 1
  2694.           KeyCode = 0
  2695.       End Select
  2696.       If DeltaIndex1 >= 0 Then
  2697.         XNext = UserX + HexDeltaX(DeltaIndex1, 0)
  2698.         If XNext <= 0 Then
  2699.           PassageFound = False
  2700.         Else
  2701.           If XNext >= MaxX Then
  2702.             PassageFound = False
  2703.           Else
  2704.             YNext = UserY + HexDeltaY(DeltaIndex1, 0)
  2705.             If YNext <= 0 Then
  2706.               PassageFound = False
  2707.             Else
  2708.               If YNext > MaxY Then
  2709.                 PassageFound = False
  2710.               Else
  2711.                 If UserPage(YNext, XNext) = 0 Then
  2712.                   PassageFound = False
  2713.                 End If
  2714.               End If
  2715.             End If
  2716.           End If
  2717.         End If
  2718.         If PassageFound Then
  2719.           XNext = XNext + HexDeltaX(DeltaIndex1, 0)
  2720.           YNext = YNext + HexDeltaY(DeltaIndex1, 0)
  2721.           If YNext < MaxY Then
  2722.             If UserPage(YNext, XNext) = 1 Then
  2723.               CurrentColor = BackoutColor
  2724.               UserPage(UserY, UserX) = 3
  2725.             Else
  2726.               CurrentColor = AdvanceColor
  2727.               UserPage(YNext, XNext) = 1
  2728.             End If
  2729.             Select Case (YNext - UserY)
  2730.               Case -4
  2731.                 XRelativeNext = UserXRelative
  2732.                 YRelativeNext = UserYRelative - Sqrt3
  2733.               Case -2
  2734.                 If XNext > UserX Then
  2735.                   XRelativeNext = UserXRelative + 3# / 2#
  2736.                   YRelativeNext = UserYRelative - Sqrt3 / 2#
  2737.                 Else
  2738.                   XRelativeNext = UserXRelative - 3# / 2#
  2739.                   YRelativeNext = UserYRelative - Sqrt3 / 2#
  2740.                 End If
  2741.               Case 2
  2742.                 If XNext > UserX Then
  2743.                   XRelativeNext = UserXRelative + 3# / 2#
  2744.                   YRelativeNext = UserYRelative + Sqrt3 / 2#
  2745.                 Else
  2746.                   XRelativeNext = UserXRelative - 3# / 2#
  2747.                   YRelativeNext = UserYRelative + Sqrt3 / 2#
  2748.                 End If
  2749.               Case Else
  2750.                 XRelativeNext = UserXRelative
  2751.                 YRelativeNext = UserYRelative + Sqrt3
  2752.             End Select
  2753.             If UsePalette Then
  2754.               OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2755.               NumRealized = RealizePalette(frm3DMaze.hDC)
  2756.             End If
  2757.             Call DrawLine(UserXRelative, UserYRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2758.             If UsePalette Then
  2759.               NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2760.             End If
  2761.           Else
  2762.             CurrentColor = AdvanceColor
  2763.             If UsePalette Then
  2764.               OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2765.               NumRealized = RealizePalette(frm3DMaze.hDC)
  2766.             End If
  2767.             Call DrawLine(UserXRelative, UserYRelative, UserXRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2768.             If UsePalette Then
  2769.               NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2770.             End If
  2771.             UserHasSolved = True
  2772.             Text1.Text = "Congratulations!"
  2773.           End If
  2774.           UserX = XNext
  2775.           UserY = YNext
  2776.           UserXRelative = XRelativeNext
  2777.           UserYRelative = YRelativeNext
  2778.         Else
  2779.           Beep
  2780.         End If
  2781.       End If
  2782.     Else
  2783.       Select Case KeyCode
  2784.         Case vbKeyPageDown, vbKeyNumpad3
  2785.           Beep
  2786.           KeyCode = 0
  2787.         Case vbKeyHome, vbKeyNumpad7
  2788.           Beep
  2789.           KeyCode = 0
  2790.         Case vbKeyLeft, vbKeyNumpad4
  2791.           DeltaIndex1 = 0
  2792.           KeyCode = 0
  2793.         Case vbKeyUp, vbKeyNumpad8
  2794.           DeltaIndex1 = 3
  2795.           KeyCode = 0
  2796.         Case vbKeyRight, vbKeyNumpad6
  2797.           DeltaIndex1 = 2
  2798.           KeyCode = 0
  2799.         Case vbKeyDown, vbKeyNumpad2
  2800.           DeltaIndex1 = 1
  2801.           KeyCode = 0
  2802.         Case vbKeyPageUp, vbKeyNumpad9
  2803.           Beep
  2804.           KeyCode = 0
  2805.         Case vbKeyEnd, vbKeyNumpad1
  2806.           Beep
  2807.           KeyCode = 0
  2808.       End Select
  2809.       If DeltaIndex1 >= 0 Then
  2810.         XNext = UserX + SqrDeltaX(DeltaIndex1, 0)
  2811.         If XNext <= 0 Then
  2812.           PassageFound = False
  2813.         Else
  2814.           If XNext >= MaxX Then
  2815.             PassageFound = False
  2816.           Else
  2817.             YNext = UserY + SqrDeltaY(DeltaIndex1, 0)
  2818.             If YNext <= 0 Then
  2819.               PassageFound = False
  2820.             Else
  2821.               If YNext > MaxY Then
  2822.                 PassageFound = False
  2823.               Else
  2824.                 If UserPage(YNext, XNext) = 0 Then
  2825.                   PassageFound = False
  2826.                 End If
  2827.               End If
  2828.             End If
  2829.           End If
  2830.         End If
  2831.         If PassageFound Then
  2832.           XNext = XNext + SqrDeltaX(DeltaIndex1, 0)
  2833.           YNext = YNext + SqrDeltaY(DeltaIndex1, 0)
  2834.           If YNext < MaxY Then
  2835.             If UserPage(YNext, XNext) = 1 Then
  2836.               CurrentColor = BackoutColor
  2837.               UserPage(UserY, UserX) = 3
  2838.             Else
  2839.               CurrentColor = AdvanceColor
  2840.               UserPage(YNext, XNext) = 1
  2841.             End If
  2842.             TemDouble = SqrDeltaX(DeltaIndex1, 0)
  2843.             XRelativeNext = UserXRelative + TemDouble
  2844.             TemDouble = SqrDeltaY(DeltaIndex1, 0)
  2845.             YRelativeNext = UserYRelative + TemDouble
  2846.             If UsePalette Then
  2847.               OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2848.               NumRealized = RealizePalette(frm3DMaze.hDC)
  2849.             End If
  2850.             Call DrawLine(UserXRelative, UserYRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2851.             If UsePalette Then
  2852.               NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2853.             End If
  2854.           Else
  2855.             CurrentColor = AdvanceColor
  2856.             If UsePalette Then
  2857.               OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2858.               NumRealized = RealizePalette(frm3DMaze.hDC)
  2859.             End If
  2860.             Call DrawLine(UserXRelative, UserYRelative, UserXRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2861.             If UsePalette Then
  2862.               NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2863.             End If
  2864.             UserHasSolved = True
  2865.             Text1.Text = "Congratulations!"
  2866.           End If
  2867.           UserX = XNext
  2868.           UserY = YNext
  2869.           UserXRelative = XRelativeNext
  2870.           UserYRelative = YRelativeNext
  2871.         Else
  2872.           Beep
  2873.         End If
  2874.       End If
  2875.     End If
  2876.   End If
  2877. End Sub
  2878.  
  2879. Private Sub Form_Load()
  2880.   Dim ColorNum As Integer
  2881.   Dim DeltaIndex1a As Byte
  2882.   Dim DeltaIndex1b As Byte
  2883.   Dim DeltaIndex1c As Byte
  2884.   Dim DeltaIndex1d As Byte
  2885.   Dim DeltaIndex1e As Byte
  2886.   Dim DeltaIndex1f As Byte
  2887.   Dim DeltaIndex2 As Integer
  2888.   Dim LogicalPalette As LOGPALETTE
  2889.   Dim NumBits As Long
  2890.   Dim NumColorsFree As Long
  2891.   Dim Tint As Integer
  2892.   OldPaletteHandle = 0
  2893.   AlreadyPainting = False
  2894.   SolutionDisplayed = False
  2895.   UserHasSolved = False
  2896.   State = 0
  2897.   Minimized = False
  2898.   mnuStyleItem(0).Checked = False
  2899.   mnuStyleItem(1).Checked = True
  2900.   SubstitutionHigh(0) = 4
  2901.   SubstitutionHigh(1) = 1
  2902.   SubstitutionHigh(2) = 2
  2903.   SubstitutionHigh(3) = 8
  2904.   SubstitutionHigh(4) = 8
  2905.   SubstitutionHigh(5) = 9
  2906.   SubstitutionHigh(6) = 9
  2907.   SubstitutionHigh(7) = 6
  2908.   SubstitutionHigh(8) = 5
  2909.   SubstitutionHigh(9) = 7
  2910.   SubstitutionHigh(10) = 2
  2911.   SubstitutionHigh(11) = 1
  2912.   SubstitutionHigh(12) = 2
  2913.   SubstitutionHigh(13) = 9
  2914.   SubstitutionHigh(14) = 8
  2915.   SubstitutionHigh(15) = 8
  2916.   SubstitutionHigh(16) = 6
  2917.   SubstitutionHigh(17) = 3
  2918.   SubstitutionHigh(18) = 5
  2919.   SubstitutionHigh(19) = 1
  2920.   SubstitutionHigh(20) = 9
  2921.   SubstitutionHigh(21) = 5
  2922.   SubstitutionHigh(22) = 4
  2923.   SubstitutionHigh(23) = 4
  2924.   SubstitutionHigh(24) = 9
  2925.   SubstitutionHigh(25) = 8
  2926.   SubstitutionHigh(26) = 6
  2927.   SubstitutionHigh(27) = 0
  2928.   SubstitutionHigh(28) = 8
  2929.   SubstitutionHigh(29) = 0
  2930.   SubstitutionHigh(30) = 6
  2931.   SubstitutionHigh(31) = 0
  2932.   SubstitutionHigh(32) = 2
  2933.   SubstitutionHigh(33) = 4
  2934.   SubstitutionHigh(34) = 1
  2935.   SubstitutionHigh(35) = 9
  2936.   SubstitutionHigh(36) = 2
  2937.   SubstitutionHigh(37) = 0
  2938.   SubstitutionHigh(38) = 7
  2939.   SubstitutionHigh(39) = 4
  2940.   SubstitutionHigh(40) = 7
  2941.   SubstitutionHigh(41) = 3
  2942.   SubstitutionHigh(42) = 0
  2943.   SubstitutionHigh(43) = 0
  2944.   SubstitutionHigh(44) = 2
  2945.   SubstitutionHigh(45) = 6
  2946.   SubstitutionHigh(46) = 8
  2947.   SubstitutionHigh(47) = 9
  2948.   SubstitutionHigh(48) = 4
  2949.   SubstitutionHigh(49) = 0
  2950.   SubstitutionHigh(50) = 8
  2951.   SubstitutionHigh(51) = 3
  2952.   SubstitutionHigh(52) = 2
  2953.   SubstitutionHigh(53) = 3
  2954.   SubstitutionHigh(54) = 2
  2955.   SubstitutionHigh(55) = 5
  2956.   SubstitutionHigh(56) = 2
  2957.   SubstitutionHigh(57) = 4
  2958.   SubstitutionHigh(58) = 6
  2959.   SubstitutionHigh(59) = 9
  2960.   SubstitutionHigh(60) = 7
  2961.   SubstitutionHigh(61) = 9
  2962.   SubstitutionHigh(62) = 1
  2963.   SubstitutionHigh(63) = 3
  2964.   SubstitutionHigh(64) = 5
  2965.   SubstitutionHigh(65) = 7
  2966.   SubstitutionHigh(66) = 1
  2967.   SubstitutionHigh(67) = 1
  2968.   SubstitutionHigh(68) = 4
  2969.   SubstitutionHigh(69) = 5
  2970.   SubstitutionHigh(70) = 8
  2971.   SubstitutionHigh(71) = 1
  2972.   SubstitutionHigh(72) = 6
  2973.   SubstitutionHigh(73) = 0
  2974.   SubstitutionHigh(74) = 5
  2975.   SubstitutionHigh(75) = 7
  2976.   SubstitutionHigh(76) = 8
  2977.   SubstitutionHigh(77) = 2
  2978.   SubstitutionHigh(78) = 3
  2979.   SubstitutionHigh(79) = 3
  2980.   SubstitutionHigh(80) = 7
  2981.   SubstitutionHigh(81) = 3
  2982.   SubstitutionHigh(82) = 5
  2983.   SubstitutionHigh(83) = 1
  2984.   SubstitutionHigh(84) = 7
  2985.   SubstitutionHigh(85) = 5
  2986.   SubstitutionHigh(86) = 4
  2987.   SubstitutionHigh(87) = 0
  2988.   SubstitutionHigh(88) = 3
  2989.   SubstitutionHigh(89) = 6
  2990.   SubstitutionHigh(90) = 3
  2991.   SubstitutionHigh(91) = 7
  2992.   SubstitutionHigh(92) = 7
  2993.   SubstitutionHigh(93) = 1
  2994.   SubstitutionHigh(94) = 9
  2995.   SubstitutionHigh(95) = 4
  2996.   SubstitutionHigh(96) = 0
  2997.   SubstitutionHigh(97) = 5
  2998.   SubstitutionHigh(98) = 6
  2999.   SubstitutionHigh(99) = 6
  3000.   SubstitutionLow(0) = 1
  3001.   SubstitutionLow(1) = 2
  3002.   SubstitutionLow(2) = 2
  3003.   SubstitutionLow(3) = 1
  3004.   SubstitutionLow(4) = 5
  3005.   SubstitutionLow(5) = 5
  3006.   SubstitutionLow(6) = 4
  3007.   SubstitutionLow(7) = 6
  3008.   SubstitutionLow(8) = 4
  3009.   SubstitutionLow(9) = 6
  3010.   SubstitutionLow(10) = 4
  3011.   SubstitutionLow(11) = 4
  3012.   SubstitutionLow(12) = 5
  3013.   SubstitutionLow(13) = 6
  3014.   SubstitutionLow(14) = 6
  3015.   SubstitutionLow(15) = 3
  3016.   SubstitutionLow(16) = 0
  3017.   SubstitutionLow(17) = 9
  3018.   SubstitutionLow(18) = 6
  3019.   SubstitutionLow(19) = 5
  3020.   SubstitutionLow(20) = 7
  3021.   SubstitutionLow(21) = 2
  3022.   SubstitutionLow(22) = 0
  3023.   SubstitutionLow(23) = 9
  3024.   SubstitutionLow(24) = 3
  3025.   SubstitutionLow(25) = 4
  3026.   SubstitutionLow(26) = 2
  3027.   SubstitutionLow(27) = 3
  3028.   SubstitutionLow(28) = 9
  3029.   SubstitutionLow(29) = 1
  3030.   SubstitutionLow(30) = 9
  3031.   SubstitutionLow(31) = 9
  3032.   SubstitutionLow(32) = 9
  3033.   SubstitutionLow(33) = 3
  3034.   SubstitutionLow(34) = 8
  3035.   SubstitutionLow(35) = 9
  3036.   SubstitutionLow(36) = 3
  3037.   SubstitutionLow(37) = 4
  3038.   SubstitutionLow(38) = 1
  3039.   SubstitutionLow(39) = 5
  3040.   SubstitutionLow(40) = 0
  3041.   SubstitutionLow(41) = 5
  3042.   SubstitutionLow(42) = 2
  3043.   SubstitutionLow(43) = 7
  3044.   SubstitutionLow(44) = 0
  3045.   SubstitutionLow(45) = 8
  3046.   SubstitutionLow(46) = 8
  3047.   SubstitutionLow(47) = 0
  3048.   SubstitutionLow(48) = 4
  3049.   SubstitutionLow(49) = 5
  3050.   SubstitutionLow(50) = 0
  3051.   SubstitutionLow(51) = 3
  3052.   SubstitutionLow(52) = 6
  3053.   SubstitutionLow(53) = 8
  3054.   SubstitutionLow(54) = 1
  3055.   SubstitutionLow(55) = 7
  3056.   SubstitutionLow(56) = 8
  3057.   SubstitutionLow(57) = 8
  3058.   SubstitutionLow(58) = 7
  3059.   SubstitutionLow(59) = 1
  3060.   SubstitutionLow(60) = 3
  3061.   SubstitutionLow(61) = 2
  3062.   SubstitutionLow(62) = 7
  3063.   SubstitutionLow(63) = 7
  3064.   SubstitutionLow(64) = 1
  3065.   SubstitutionLow(65) = 8
  3066.   SubstitutionLow(66) = 0
  3067.   SubstitutionLow(67) = 3
  3068.   SubstitutionLow(68) = 7
  3069.   SubstitutionLow(69) = 5
  3070.   SubstitutionLow(70) = 2
  3071.   SubstitutionLow(71) = 6
  3072.   SubstitutionLow(72) = 4
  3073.   SubstitutionLow(73) = 0
  3074.   SubstitutionLow(74) = 9
  3075.   SubstitutionLow(75) = 9
  3076.   SubstitutionLow(76) = 7
  3077.   SubstitutionLow(77) = 7
  3078.   SubstitutionLow(78) = 4
  3079.   SubstitutionLow(79) = 6
  3080.   SubstitutionLow(80) = 2
  3081.   SubstitutionLow(81) = 0
  3082.   SubstitutionLow(82) = 0
  3083.   SubstitutionLow(83) = 1
  3084.   SubstitutionLow(84) = 7
  3085.   SubstitutionLow(85) = 3
  3086.   SubstitutionLow(86) = 6
  3087.   SubstitutionLow(87) = 6
  3088.   SubstitutionLow(88) = 1
  3089.   SubstitutionLow(89) = 1
  3090.   SubstitutionLow(90) = 2
  3091.   SubstitutionLow(91) = 4
  3092.   SubstitutionLow(92) = 5
  3093.   SubstitutionLow(93) = 9
  3094.   SubstitutionLow(94) = 8
  3095.   SubstitutionLow(95) = 2
  3096.   SubstitutionLow(96) = 8
  3097.   SubstitutionLow(97) = 8
  3098.   SubstitutionLow(98) = 3
  3099.   SubstitutionLow(99) = 5
  3100.   NumColorsFree = 1
  3101.   NumBits = GetDeviceCaps(frm3DMaze.hDC, PLANES) * GetDeviceCaps(frm3DMaze.hDC, BITSPIXEL)
  3102.   Do While (NumBits > 0)
  3103.     NumColorsFree = 2 * NumColorsFree
  3104.     NumBits = NumBits - 1
  3105.   Loop
  3106.   NumColorsFree = NumColorsFree - GetDeviceCaps(frm3DMaze.hDC, COLORS)
  3107.   If NumColorsFree < 16 Then
  3108.     UsePalette = False
  3109.   Else
  3110.     UsePalette = True
  3111.   End If
  3112.   LogicalPalette.palVersion = 3 * 256
  3113.   LogicalPalette.palNumEntries = 16
  3114.   For ColorNum = 0 To NumColors - 4
  3115.     ' evenly spaced shades of gray
  3116.     Tint = (256 * ColorNum) \ (NumColors - 3)
  3117.     LogicalPalette.palPalEntry(ColorNum).peRed = Tint
  3118.     LogicalPalette.palPalEntry(ColorNum).peGreen = Tint
  3119.     LogicalPalette.palPalEntry(ColorNum).peBlue = Tint
  3120.     LogicalPalette.palPalEntry(ColorNum).peFlags = PC_NOCOLLAPSE
  3121.     RedGreenBlue(ColorNum) = RGB(Tint, Tint, Tint)
  3122.   Next ColorNum
  3123.   LogicalPalette.palPalEntry(BackoutColor).peRed = 255
  3124.   LogicalPalette.palPalEntry(BackoutColor).peGreen = 255
  3125.   LogicalPalette.palPalEntry(BackoutColor).peBlue = 0
  3126.   LogicalPalette.palPalEntry(BackoutColor).peFlags = PC_NOCOLLAPSE
  3127.   RedGreenBlue(BackoutColor) = RGB(255, 0, 255)
  3128.   LogicalPalette.palPalEntry(AdvanceColor).peRed = 0
  3129.   LogicalPalette.palPalEntry(AdvanceColor).peGreen = 255
  3130.   LogicalPalette.palPalEntry(AdvanceColor).peBlue = 0
  3131.   LogicalPalette.palPalEntry(AdvanceColor).peFlags = PC_NOCOLLAPSE
  3132.   RedGreenBlue(AdvanceColor) = RGB(0, 0, 255)
  3133.   LogicalPalette.palPalEntry(SolutionColor).peRed = 255
  3134.   LogicalPalette.palPalEntry(SolutionColor).peGreen = 0
  3135.   LogicalPalette.palPalEntry(SolutionColor).peBlue = 0
  3136.   LogicalPalette.palPalEntry(SolutionColor).peFlags = PC_NOCOLLAPSE
  3137.   RedGreenBlue(SolutionColor) = RGB(255, 0, 0)
  3138.   If UsePalette Then
  3139.     PaletteHandle = CreatePalette(LogicalPalette)
  3140.   End If
  3141.  
  3142.   HexDeltaY(0, 0) = -1
  3143.   HexDeltaX(0, 0) = -2
  3144.   HexDeltaY(1, 0) = 1
  3145.   HexDeltaX(1, 0) = -2
  3146.   HexDeltaY(2, 0) = -2
  3147.   HexDeltaX(2, 0) = 0
  3148.   HexDeltaY(3, 0) = 2
  3149.   HexDeltaX(3, 0) = 0
  3150.   HexDeltaY(4, 0) = -1
  3151.   HexDeltaX(4, 0) = 2
  3152.   HexDeltaY(5, 0) = 1
  3153.   HexDeltaX(5, 0) = 2
  3154.   DeltaIndex2 = 0
  3155.   For DeltaIndex1a = 0 To 5
  3156.     For DeltaIndex1b = 0 To 5
  3157.       If DeltaIndex1a <> DeltaIndex1b Then
  3158.         For DeltaIndex1c = 0 To 5
  3159.           If (DeltaIndex1a <> DeltaIndex1c) And (DeltaIndex1b <> DeltaIndex1c) Then
  3160.             For DeltaIndex1d = 0 To 5
  3161.               If (DeltaIndex1a <> DeltaIndex1d) And (DeltaIndex1b <> DeltaIndex1d) And (DeltaIndex1c <> DeltaIndex1d) Then
  3162.                 For DeltaIndex1e = 0 To 5
  3163.                   If (DeltaIndex1a <> DeltaIndex1e) And (DeltaIndex1b <> DeltaIndex1e) And (DeltaIndex1c <> DeltaIndex1e) And (DeltaIndex1d <> DeltaIndex1e) Then
  3164.                     For DeltaIndex1f = 0 To 5
  3165.                       If (DeltaIndex1a <> DeltaIndex1f) And (DeltaIndex1b <> DeltaIndex1f) And (DeltaIndex1c <> DeltaIndex1f) And (DeltaIndex1d <> DeltaIndex1f) And (DeltaIndex1e <> DeltaIndex1f) Then
  3166.                         HexDeltaX(DeltaIndex1a, DeltaIndex2) = HexDeltaX(0, 0)
  3167.                         HexDeltaY(DeltaIndex1a, DeltaIndex2) = HexDeltaY(0, 0)
  3168.                         HexDeltaX(DeltaIndex1b, DeltaIndex2) = HexDeltaX(1, 0)
  3169.                         HexDeltaY(DeltaIndex1b, DeltaIndex2) = HexDeltaY(1, 0)
  3170.                         HexDeltaX(DeltaIndex1c, DeltaIndex2) = HexDeltaX(2, 0)
  3171.                         HexDeltaY(DeltaIndex1c, DeltaIndex2) = HexDeltaY(2, 0)
  3172.                         HexDeltaX(DeltaIndex1d, DeltaIndex2) = HexDeltaX(3, 0)
  3173.                         HexDeltaY(DeltaIndex1d, DeltaIndex2) = HexDeltaY(3, 0)
  3174.                         HexDeltaX(DeltaIndex1e, DeltaIndex2) = HexDeltaX(4, 0)
  3175.                         HexDeltaY(DeltaIndex1e, DeltaIndex2) = HexDeltaY(4, 0)
  3176.                         HexDeltaX(DeltaIndex1f, DeltaIndex2) = HexDeltaX(5, 0)
  3177.                         HexDeltaY(DeltaIndex1f, DeltaIndex2) = HexDeltaY(5, 0)
  3178.                         DeltaIndex2 = DeltaIndex2 + 1
  3179.                       End If
  3180.                     Next DeltaIndex1f
  3181.                   End If
  3182.                 Next DeltaIndex1e
  3183.               End If
  3184.             Next DeltaIndex1d
  3185.           End If
  3186.         Next DeltaIndex1c
  3187.       End If
  3188.     Next DeltaIndex1b
  3189.   Next DeltaIndex1a
  3190.   SqrDeltaY(0, 0) = 0
  3191.   SqrDeltaX(0, 0) = -1
  3192.   SqrDeltaY(1, 0) = 1
  3193.   SqrDeltaX(1, 0) = 0
  3194.   SqrDeltaY(2, 0) = 0
  3195.   SqrDeltaX(2, 0) = 1
  3196.   SqrDeltaY(3, 0) = -1
  3197.   SqrDeltaX(3, 0) = 0
  3198.   DeltaIndex2 = 0
  3199.   For DeltaIndex1a = 0 To 3
  3200.     For DeltaIndex1b = 0 To 3
  3201.       If DeltaIndex1a <> DeltaIndex1b Then
  3202.         For DeltaIndex1c = 0 To 3
  3203.           If (DeltaIndex1a <> DeltaIndex1c) And (DeltaIndex1b <> DeltaIndex1c) Then
  3204.             For DeltaIndex1d = 0 To 3
  3205.               If (DeltaIndex1a <> DeltaIndex1d) And (DeltaIndex1b <> DeltaIndex1d) And (DeltaIndex1c <> DeltaIndex1d) Then
  3206.                 SqrDeltaX(DeltaIndex1a, DeltaIndex2) = SqrDeltaX(0, 0)
  3207.                 SqrDeltaY(DeltaIndex1a, DeltaIndex2) = SqrDeltaY(0, 0)
  3208.                 SqrDeltaX(DeltaIndex1b, DeltaIndex2) = SqrDeltaX(1, 0)
  3209.                 SqrDeltaY(DeltaIndex1b, DeltaIndex2) = SqrDeltaY(1, 0)
  3210.                 SqrDeltaX(DeltaIndex1c, DeltaIndex2) = SqrDeltaX(2, 0)
  3211.                 SqrDeltaY(DeltaIndex1c, DeltaIndex2) = SqrDeltaY(2, 0)
  3212.                 SqrDeltaX(DeltaIndex1d, DeltaIndex2) = SqrDeltaX(3, 0)
  3213.                 SqrDeltaY(DeltaIndex1d, DeltaIndex2) = SqrDeltaY(3, 0)
  3214.                 DeltaIndex2 = DeltaIndex2 + 1
  3215.               End If
  3216.             Next DeltaIndex1d
  3217.           End If
  3218.         Next DeltaIndex1c
  3219.       End If
  3220.     Next DeltaIndex1b
  3221.   Next DeltaIndex1a
  3222.   Sqrt3 = Sqr(3#)
  3223. End Sub
  3224.  
  3225.  
  3226. Private Sub Form_Paint()
  3227.   mnuActionItem(1).Enabled = False
  3228.   mnuActionItem(2).Enabled = False
  3229.   Paint = True
  3230.   State = 0
  3231.   If Not AlreadyPainting Then
  3232.     AlreadyPainting = True
  3233.     Timer1.Enabled = True
  3234.   End If
  3235. End Sub
  3236.  
  3237. Private Sub Form_Resize()
  3238.   If WindowState = 1 Then
  3239.     Minimized = True
  3240.     Cls
  3241.     State = 5
  3242.     AlreadyPainting = False
  3243.   Else
  3244.     If ScaleHeight < 3 * Text1.Height Then
  3245.       Minimized = False
  3246.       Cls
  3247.       State = 5
  3248.       AlreadyPainting = False
  3249.       Text1.Text = "This window is too small!"
  3250.     Else
  3251.       VScroll1.Height = ScaleHeight - Text1.Height
  3252.       VScroll1.Left = ScaleWidth - VScroll1.Width
  3253.       Text1.Top = ScaleHeight - Text1.Height
  3254.       Text1.Width = ScaleWidth
  3255.       Paint = True
  3256.       State = 0
  3257.       If (Not Minimized) Then
  3258.         Resize = True
  3259.         UserHasSolved = False
  3260.         SolutionDisplayed = False
  3261.         Seed = Str(Timer)
  3262.       End If
  3263.       Minimized = False
  3264.       Refresh
  3265.     End If
  3266.   End If
  3267. End Sub
  3268.  
  3269.  
  3270. Private Sub Form_Unload(Cancel As Integer)
  3271.   State = 6
  3272.   Timer1.Enabled = False
  3273.   Erase Stack
  3274.   Erase UserPage
  3275.   Erase ComputerPage
  3276. End Sub
  3277.  
  3278.  
  3279.  
  3280. Private Sub mnuActionItem_Click(Index As Integer)
  3281.   Select Case Index
  3282.     Case 0
  3283.       SolutionDisplayed = False
  3284.       Call Form_Resize
  3285.     Case 1
  3286.       SolutionDisplayed = True
  3287.       Text1.Text = ""
  3288.       If mnuStyleItem(0).Checked Then
  3289.         Call HexDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  3290.       Else
  3291.         Call SqrDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  3292.       End If
  3293.     Case 2
  3294.       UserHasSolved = False
  3295.       SolutionDisplayed = False
  3296.       Paint = True
  3297.       State = 0
  3298.       For UserX = 0 To MaxX
  3299.         For UserY = 0 To MaxY
  3300.           If ComputerPage(UserY, UserX) = 0 Then
  3301.             UserPage(UserY, UserX) = 0
  3302.           Else
  3303.             UserPage(UserY, UserX) = 2
  3304.           End If
  3305.         Next UserY
  3306.       Next UserX
  3307.       If mnuStyleItem(0).Checked Then
  3308.         UserX = 3
  3309.         UserXRelative = 1#
  3310.         UserY = 2
  3311.         UserYRelative = Sqrt3 / 2#
  3312.       Else
  3313.         UserX = 1
  3314.         UserXRelative = (RelativeWidthOfWall + 1#) / 2#
  3315.         UserY = 1
  3316.         UserYRelative = (RelativeWidthOfWall + 1#) / 2#
  3317.       End If
  3318.       UserPage(UserY, UserX) = 1
  3319.       Refresh
  3320.     Case 4
  3321.       State = 6
  3322.       Timer1.Enabled = False
  3323.       Erase Stack
  3324.       Erase UserPage
  3325.       Erase ComputerPage
  3326.       End
  3327.     Case Else
  3328.   End Select
  3329. End Sub
  3330.  
  3331. Private Sub mnuHelpItem_Click(Index As Integer)
  3332.   Dim rc As Integer
  3333.   rc = MsgBox("3DMaze" + Chr(13) + Chr(13) + "Copyright " + Chr(169) + " 1995 James L. Dean (csvcjld@nomvs.lsumc.edu)" + Chr(13) + Chr(13) + "This application may be distributed without payment to James L. Dean." + Chr(13) + Chr(13) + "As per Microsoft's license for Visual Basic 4.0, the end-user may not distribute the components having names starting with other than " + Chr(34) + "3dmaze" + Chr(34) + ".", vbOKOnly, "About 3DMaze")
  3334. End Sub
  3335.  
  3336. Private Sub mnuStyleItem_Click(Index As Integer)
  3337.   Select Case Index
  3338.     Case 0
  3339.       If mnuStyleItem(1).Checked Then
  3340.         mnuStyleItem(0).Checked = True
  3341.         mnuStyleItem(1).Checked = False
  3342.         SolutionDisplayed = False
  3343.         Call Form_Resize
  3344.       End If
  3345.     Case 1
  3346.       If mnuStyleItem(0).Checked Then
  3347.         mnuStyleItem(0).Checked = False
  3348.         mnuStyleItem(1).Checked = True
  3349.         SolutionDisplayed = False
  3350.         Call Form_Resize
  3351.       End If
  3352.   End Select
  3353. End Sub
  3354.  
  3355. Private Sub Timer1_Timer()
  3356.   Timer1.Enabled = False
  3357.   If mnuStyleItem(0).Checked Then
  3358.     Call HexOutputMaze
  3359.   Else
  3360.     Call SqrOutputMaze
  3361.   End If
  3362. End Sub
  3363.  
  3364. Private Sub VScroll1_Change()
  3365.   Tilt = 90 - VScroll1.Value
  3366.   Paint = True
  3367.   State = 0
  3368.   If Not AlreadyPainting Then Call Form_Paint
  3369. End Sub
  3370.  
  3371. Private Sub VScroll1_Scroll()
  3372.   If AlreadyPainting Then
  3373.     Tilt = 90 - VScroll1.Value
  3374.     Paint = True
  3375.     State = 0
  3376.   End If
  3377. End Sub
  3378.  
  3379.  
  3380.  
  3381.